Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 使用ContentCachingResponseWrapper丢失标题_Spring Mvc_Spring Boot_Servlets_Interceptor - Fatal编程技术网

Spring mvc 使用ContentCachingResponseWrapper丢失标题

Spring mvc 使用ContentCachingResponseWrapper丢失标题,spring-mvc,spring-boot,servlets,interceptor,Spring Mvc,Spring Boot,Servlets,Interceptor,我必须记录响应正文和响应标题。为此,我使用了拦截器和ContentCachingResponseWrapper类(我也尝试了filter,但结果相同)。当我将两者结合使用时,我会丢失一些头信息,但如果我只使用拦截器,则不会丢失 我的调度员服务: @Component("dispatcherServlet") public class MyDisPatcherServlet extends DispatcherServlet { @Override protected void d

我必须记录响应正文和响应标题。为此,我使用了拦截器和ContentCachingResponseWrapper类(我也尝试了filter,但结果相同)。当我将两者结合使用时,我会丢失一些头信息,但如果我只使用拦截器,则不会丢失

我的调度员服务:

@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;
}
private Map getHeaders(HttpServletResponse){
Map headersList=new HashMap();
集合标题名称=((ContentCachingResponseWrapper)响应);
//如果我使用response.getHeaderNames()也一样
if(headerNames!=null){
用于(字符串头名称:头名称){
headersList.put(headerName,Arrays.asList(response.getHeaders(headerName));
}
}
返回标题列表;
}
标题结果:

{Set Cookie=[[JSESSIONID=109DE678B86611DE627B9B7B3B513DEF; 路径=/service/services;HttpOnly]]}


如果我取消激活组件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;
}
private Map getHeaders(HttpServletResponse){
Map headersList=new HashMap();
Collection headerNames=response.getHeaderNames();
if(headerNames!=null){
用于(字符串头名称:头名称){
headersList.put(headerName,Arrays.asList(response.getHeaders(headerName));
}
}
返回标题列表;
}
标题结果:

{X-Frame-Options=[[DENY]],传输编码=[[chunked]], 缓存控制=[[无缓存,无存储,最大年龄=0,必须重新验证]], X-Content-Type-Options=[[nosniff]],Connection=[[close]], 设置Cookie=[[JSESSIONID=9E2F642595202D87935F4CD5C089ADFE; Path=/service/services;HttpOnly]],Pragma=[[no cache]], Expires=[[0]],X-XSS-Protection=[[1;mode=block]],Date=[[周一,7月23日] 2018年16:15:55 GMT]],内容类型=[[application/json;charset=UTF-8]]


提前感谢。

在检索标题之前,您必须调用
copyBodyToResponse()

您能够检索标题吗?