共计 3272 个字符,预计需要花费 9 分钟才能阅读完成。
定义一个拦截器:
@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);
}
}
}
正文完
发表至: springboot
2022-11-08