在doFilter调用之后设置响应头

时间:2019-05-03 01:07:24

标签: java servlets servlet-filters

因此,我一直在观察有关该主题的一些答案,并且我了解到doFilter()调用完成后,现在修改一个repsonse标头为时已晚,并且要最好地处理这种情况,我应该使用响应包装器。

我想知道如何处理这样的情况,即我只想在已冒泡返回到我的过滤器的响应具有特定状态代码的情况下设置标头。是否应该在doFilter之前处理该逻辑?在Request Wrapper类中?我有点困惑。

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest httpRequest;
        HttpServletResponse servlettResponse = (HttpServletResponse)response;
    CrossOriginResponseWrapper crossOriginResponseWrapper = new CrossOriginResponseWrapper(servlettResponse);
    if (crossOriginResponseWrapper.getStatus() == 404) {
        crossOriginResponseWrapper.addHeader("Access-Control-Allow-Origin", "*");
    }
    chain.doFilter(request, crossOriginResponseWrapper);


    LOG.info(crossOriginResponseWrapper.getHeader("Access-Control-Allow-Origin"));

    LOG.info(servlettResponse.getStatus());
}

更新:

是在包装器中解决此覆盖方法的唯一方法,以便在响应到达我的过滤器之前不会写入/丢弃响应吗?有没有更简单的解决方案?

(参考此答案) Response is committing and doFilter chain is broken

1 个答案:

答案 0 :(得分:0)

不,那是唯一的方法。 这里有一个有效的例子。 https://github.com/sercasti/spring-httpserver-timings/blob/master/src/main/java/io/github/sercasti/tracing/filter/TracingFilter.java

我用包装器包装了原始的Response,从而避免了其他过滤器调用.write方法,该方法立即提交响应并阻止您添加标头。

通过使用此包装器,其他过滤器将写入我的包装器,然后当我的过滤器将控件取回时,我将添加标头,并有效地写入原始响应。