首页 文章

使用ContentCachingResponseWrapper丢失标头

提问于
浏览
0

我必须记录响应正文和响应标头 . 为此,我使用Interceptor和ContentCachingResponseWrapper类(我也试过过滤器,但结果相同) . 当我将两者结合起来时,我会丢失一些 Headers 信息,但如果我只使用Interceptor则不会 .

我的调度员服务:

@Component("dispatcherServlet")
public class MyDisPatcherServlet extends DispatcherServlet {
    @Override
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            super.doDispatch(request, new ContentCachingResponseWrapper(response));
        } catch (Exception e) {
            super.doDispatch(request,response);
        }
    }
}

当我在拦截器的postHandle中使用ContentCachingResponseWrapper时:

private Map<String, List<Object>> getHeaders(HttpServletResponse response){
    Map<String, List<Object>> headersList = new HashMap<>();
    Collection<String> headerNames = ((ContentCachingResponseWrapper)response).getHeaderNames();
    // Same if I use response.getHeaderNames()
    if (headerNames != null) {
        for(String headerName : headerNames){
            headersList.put(headerName, Arrays.asList(response.getHeaders(headerName))); 
        }
    }
    return headersList;
}

Headers 结果:

{Set-Cookie = [[JSESSIONID = 109DE678B86611DE627B9B7B3B513DEF;路径= /服务/服务;仅Http]}


如果我取消激活组件MyDisPatcherServlet,并直接从响应中读取 Headers 名称:

private Map<String, List<Object>> getHeaders(HttpServletResponse response){
    Map<String, List<Object>> headersList = new HashMap<>();
    Collection<String> headerNames = response.getHeaderNames();
    if (headerNames != null) {
        for(String headerName : headerNames){
            headersList.put(headerName, Arrays.asList(response.getHeaders(headerName))); 
        }
    }
    return headersList;
}

Headers 结果:

{X-Frame-Options = [[DENY]],Transfer-Encoding = [[chunked]],Cache-Control = [[no-cache,no-store,max-age = 0,must-revalidate]], X-Content-Type-Options = [[nosniff]],Connection = [[close]],Set-Cookie = [[JSESSIONID = 9E2F642595202D87935F4CD5C089ADFE;路径= /服务/服务; HttpOnly]],Pragma = [[no-cache]],Expires = [[0]],X-XSS-Protection = [[1; mode = block]],Date = [[Mon,23 Jul 2018 16:15:55 GMT]],Content-Type = [[application / json; charset = UTF-8]]}

提前致谢 .

1 回答

  • 0

    在检索 Headers 之前,您必须调用 copyBodyToResponse() .

相关问题