问题描述
org.springframework.web.filter.ShallowEtagHeaderFilter
无法在WAS8应用服务器下设置响应标头,声明 警告:无法设置标头。已经提交 。但是,在Tomcat服务器下测试时,此工作正常。 ShallowEtagHeaderFilter
确实包含原始响应以延迟响应体的写入,但仍然响应在过滤器链执行后提交。这是一个可能的websphere错误吗?任何克服此问题的建议/解决方法都是受欢迎的。
org.springframework.web.filter.ShallowEtagHeaderFilter
is unable to set response header under WAS8 application server stating "WARNING: Cannot set header. Response already committed". However this works fine when tested under Tomcat server. ShallowEtagHeaderFilter
is indeed wrapping the original response to delay the writing of response body, but still the response comes as committed after the filter chain's execution. Is this a possible websphere bug? Any suggestion / workaround to overcome this issue is welcome.
推荐答案
我通过覆盖 ServletResponse解决了这个问题。 flushBuffer
方法。在WAS8下 flushBuffer
过早被调用。将 HttpServletResponseWrapper
传递给 ShallowEtagHeaderFilter $ >做了诀窍。
I solved this issue by overriding ServletResponse.flushBuffer
method. Under WAS8 flushBuffer
is getting called prematurely. Passing a HttpServletResponseWrapper
with a no-operation flushBuffer
method to ShallowEtagHeaderFilter
did the trick.
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
}
}
}
这篇关于ShallowEtagHeaderFilter在WAS8应用服务器下无法运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!