当前位置 : 主页 > 编程语言 > java >

108-拦截器获取请求body

来源:互联网 收集:自由互联 发布时间:2022-10-26
定义一个拦截器: @Componentpublic class SjcjInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler in

定义一个拦截器:

@Component public class SjcjInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } String token = request.getHeader("token"); RequestWrapper requestWrapper = new RequestWrapper(request); String body = (String)requestWrapper.getAttribute("body"); return true; } }

定义一个请求wrapper

public class RequestWrapper extends HttpServletRequestWrapper { private static Logger logger = LoggerFactory.getLogger(RequestWrapper.class); private String body; public RequestWrapper(HttpServletRequest request) { super(request); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; InputStream inputStream = null; try { inputStream = request.getInputStream(); if (inputStream != null) { String charsetName = "UTF-8"; String contentType = request.getHeader("Content-Type"); if (!(StrUtil.isBlank(contentType) || "undefined".equals(contentType))) { contentType = contentType.replaceAll(" ", ""); // application/json; charset=utf-8 String[] contentTypeArr = contentType.split(";"); for (String str : contentTypeArr) { if (str.startsWith("charset=")) { charsetName = str.substring(8); break; } } } logger.info("defaultCharsetName: {}", Charset.defaultCharset().name()); logger.info("charsetName: {}", charsetName); if (StrUtil.isBlank(charsetName) || "undefined".equals(charsetName)) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); } else { bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charsetName)); } String str = null; while ((str = bufferedReader.readLine()) != null) { stringBuilder.append(str); } } else { stringBuilder.append(""); } } catch (IOException ex) { logger.error("body读取失败"); logger.error(ex.getMessage()); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; } public void setBody(String body) { this.body = body; } }

定义RequestFilter

@Component public class CustomRequestFilter extends OncePerRequestFilter { private static Logger logger = LoggerFactory.getLogger(CustomRequestFilter.class); private String aesSecret = "B16883417B43599B6AF58A0E8769F46D"; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { RequestWrapper requestWrapper = new RequestWrapper(request); if(requestWrapper == null) { filterChain.doFilter(request, response); } else { String body = requestWrapper.getBody(); //在这里可以修改body的内容 // requestWrapper.setBody(obj); requestWrapper.setAttribute("body",body); filterChain.doFilter(requestWrapper, response); } } }
上一篇:109-修改返回体的内容RestControllerAdvice
下一篇:没有了
网友评论