我必须记录响应正文和响应标头 . 为此,我使用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 回答
在检索 Headers 之前,您必须调用
copyBodyToResponse()
.