首页 > 解决方案 > 从 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。

标签: spring-boothttpspring-mvcservletsservlet-filters

解决方案


推荐阅读