在doFilter之后添加响应头

时间:2014-06-09 18:56:21

标签: servlets http-headers servlet-filters

我已经搜索并看到了这个问题的几个帖子,但没有找到答案它是如何可能的。

我想要做的是在过滤器链之后添加标题

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResp = (HttpServletResponse) response;

try {
HttpServletResponseWrapper bufferedResponse = new     HttpServletResponseWrapper (httpResp); 

chain.doFilter(request, bufferedResponse);

} finally {   
// header added at this line is not actually being added.        
bufferedResponse.setHeader("ADD A HEADER: ", "HEADER");
}                                     
}

多个帖子正在谈论它可以通过使用HttpServletResponseWrapper但它不适合我,任何人都可以帮助我。

2 个答案:

答案 0 :(得分:4)

在提交响应之后,您无法添加标头(好吧,您可以但它不会产生任何影响),因为此时HTTP标头已全部写入客户端。 / p>

您有三种选择。

  1. 在调用doFilter()
  2. 之前编写标题
  3. 在尝试添加标题之前,请确保(大缓冲区,小响应,没有调用flush()等)响应未提交。
  4. 在do filter方法之前包装响应,然后在包装器中缓冲整个响应主体,然后添加标头,然后从缓冲区中写出响应主体。

答案 1 :(得分:0)

您可以在do过滤器后添加标头,但这不能保证它始终有效。一种不起作用的情况是, 当任何servlet /过滤器调用response.sendRedirect时。

`Filter A - pre work 
           doFilter ------> Servlet A - do some work
                                       invoke response.sendRedirect
           post work - add/Set Headers (These will get ignored).`

注意:还可以有其他情况。