问题描述
我使用afterCompletion拦截器记录请求以及响应代码:
public class Logger4XX extends handlerinterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {
int code = response.getStatus();
....
log request and response code here
....
}
}
要在那里启用阅读请求正文,我必须使用包装HttpServletRequest的过滤器:
@Component
public class RequestWrapperFilter implements Filter {
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,servletexception {
CachedHttpServletRequest wrapper = new CachedHttpServletRequest((HttpServletRequest) request);
chain.doFilter(wrapper,response);
}
}
对于成功的响应(2XX)来说效果很好,但是对于产生4XX代码的请求来说有点奇怪:
- 对于404响应,我看到了对afterCompletion的两次调用,第一个带有预期的包装请求(CachedHttpServletRequest),第二个带有HttpServletRequest的原始实现(org.apache.catalina.core.ApplicationHttpRequest)
- 对于406响应(错误的Accept标头),我看到了唯一的调用,但是HttpServletRequest未包装,因此请求正文不可用
是否有办法解决至少第二个问题,所以每个请求都被包装了?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)