ShallowEtagHeaderFilter在WAS8应用服务器下不起作用


问题内容

org.springframework.web.filter.ShallowEtagHeaderFilter无法在WAS8应用程序服务器下设置响应标头,说明为“
警告:无法设置标头。响应已提交
”。但是,在Tomcat服务器上进行测试时,此方法工作正常。ShallowEtagHeaderFilter确实包装了原始响应以延迟响应主体的编写,但是响应仍然是在过滤器链执行后提交的。这是可能的Websphere错误吗?欢迎提供任何解决此问题的建议/解决方法。


问题答案:

我通过覆盖ServletResponse.flushBuffer方法解决了这个问题。在WAS8下flushBuffer过早地被调用。通过HttpServletResponseWrapper不操作的flushBuffer方法来解决问题ShallowEtagHeaderFilter

public class HttpCacheFilter extends ShallowEtagHeaderFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        HttpCacheResponseWrapper responseWrapper = new HttpCacheResponseWrapper(response);
        super.doFilterInternal(request, responseWrapper, filterChain);
    }

    private static class HttpCacheResponseWrapper extends HttpServletResponseWrapper {

        public HttpCacheResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        @Override
        public void flushBuffer() throws IOException {
            // NOOP
        }
    }
}