spring-boot - 从 FilterChain 返回后 HTTP 请求正文的内容发生变化
问题描述
我有一个过滤器记录请求正文两次。首先,我从请求对象打印请求正文,然后将请求和响应对象传递给 FilterChain。然后在 finally{} 我再次打印请求对象中的正文内容。但是内容已经不一样了。实际上,Step-1 的内容是空的,Step-2 看起来更好。会发生什么?
public class RequestAndResponseLoggingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (isAsyncDispatch(request)) {
filterChain.doFilter(request, response);
} else {
doFilterWrapped(wrapRequest(request), wrapResponse(response), filterChain);
}
}
protected void doFilterWrapped(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response, FilterChain filterChain) throws IOException, ServletException {
try {
// Step-1: Print the request body (at request time)
String requestBody = extractRequestBody(request);
log.info("Request Body: " + requestBody);
// Pass the request and response object to FilterChain
filterChain.doFilter(request, response);
}
finally {
// Step-2: Print again the request body (at response time). Do not get the same output as in Step-1.
String requestBody = extractRequestBody(request);
log.info("Request Body: " + requestBody);
}
}
private static String extractRequestBody(ContentCachingRequestWrapper request) {
byte[] content = request.getContentAsByteArray();
if (content.length > 0) {
return new String(content, request.getContentType());
}
return "";
}
}
我知道可能有另一个过滤器或拦截器可以改变它,但我没有这样的。至少不是我写的。在请求处理期间更改请求对象中的请求正文的机制是什么?我正在将 Spring Boot 与 Spring MVC 一起使用。我的过滤器从 springframework 扩展了 OncePerRequestFilter。
解决方案
推荐阅读
- c# - 如何测量并行处理中运行的每个任务的时间?
- html - CSS 导航栏文本定位
- python - 操作系统错误,没有这样的文件或目录:我无法安装某些软件包
- gcc - ARM GCC Cortex-M7 裸机编译器标志,用于正确的浮点堆栈对齐?
- bash - 如果 VPS1 失败或向 VPS2 发送一些任务,我如何让 VPS2 自动工作?
- python - Python、Windows:术语“conda”未被识别为 cmdlet 的名称
- python - 如何循环 BeautifulSoup 的 URL 输出?
- common-lisp - set-dispatch-macro-character 的完整文档在哪里?
- swift - Swift 使用 Delegate 刷新 Tableview
- reactjs - 如何使用不同的 React.render() 函数在组件之间共享数据