使用 ContentCachingResponseWrapper 丢失标头

问题描述 投票:0回答:1

我必须记录响应正文和响应标头。为此,我使用 Interceptor 和

ContentCachingResponseWrapper
类(我也尝试过使用过滤器,但结果相同)。当我将两者结合起来时,我会丢失一些 HTTP 标头信息,但如果我仅使用 Interceptor,则不会丢失。

我的调度程序 servlet:

@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;
}

标题结果:

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


如果我停用组件

MyDisPatcherServlet
,并直接从响应中读取标头名称:

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;
}

标题结果:

{X-Frame-Options=[[DENY]],传输编码=[[分块]],
Cache-Control=[[无缓存,无存储,最大年龄=0,必须重新验证]],
X-Content-Type-Options=[[nosniff]],连接=[[close]],
设置-Cookie=[[JSESSIONID=9E2F642595202D87935F4CD5C089ADFE;
路径=/服务/服务; HttpOnly]],Pragma=[[无缓存]],
过期=[[0]],X-XSS-保护=[[1;模式=块]],日期=[[7 月 23 日星期一 2018 16:15:55 GMT]],Content-Type=[[application/json;charset=UTF-8]]}

提前致谢。

spring-mvc spring-boot servlets interceptor
1个回答
6
投票

在检索标头之前,您必须调用

copyBodyToResponse()

© www.soinside.com 2019 - 2024. All rights reserved.