Spring mvc 使用ContentCachingResponseWrapper丢失标题
我必须记录响应正文和响应标题。为此,我使用了拦截器和ContentCachingResponseWrapper类(我也尝试了filter,但结果相同)。当我将两者结合使用时,我会丢失一些头信息,但如果我只使用拦截器,则不会丢失 我的调度员服务: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
@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()
。您能够检索标题吗?