Spring Boot拦截器和过滤器对导致4XX代码的请求的调用

问题描述

我使用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代码的请求来说有点奇怪:

  1. 对于404响应,我看到了对afterCompletion的两次调用,第一个带有预期的包装请求(CachedHttpServletRequest),第二个带有HttpServletRequest的原始实现(org.apache.catalina.core.ApplicationHttpRequest)
  2. 对于406响应(错误的Accept标头),我看到了唯一的调用,但是HttpServletRequest未包装,因此请求正文不可用

是否有办法解决至少第二个问题,所以每个请求都被包装了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...