Servlets 在doFilter之后添加响应头

Servlets 在doFilter之后添加响应头,servlets,http-headers,servlet-filters,Servlets,Http Headers,Servlet Filters,我已经搜索并看到了一些关于这个问题的帖子,但是没有找到答案 我要做的是在过滤器链之后添加标题 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResp = (HttpServletResponse) response; try { Http

我已经搜索并看到了一些关于这个问题的帖子,但是没有找到答案

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

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是可能的,但它对我不起作用,有人能帮我吗。

在提交响应后,您不能添加头(当然,您可以,但不会有任何效果),因为此时HTTP头都已写入客户端

你有三个选择

  • 在调用doFilter()之前写下标题
  • 确保(大缓冲区、小响应、不调用flush()等)在尝试添加标头之前未提交响应
  • 在do filter方法和buffer之前包装响应,然后在包装器中包装整个响应体,然后添加标头,然后从缓冲区写出响应体

  • 您可以在do filter之后添加标题,但这不能保证它始终有效。有一种情况是它不起作用, 当任何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).`
    

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

    是的,我正在尝试实施您建议的选项2或3。但还没有成功。你有这方面的示例代码吗。[链接]使用以下方法缓冲响应。我正在使用响应头,但如何添加headerApproach 3只有在没有响应体的情况下才有效。如果有一个响应机构,它不起作用。你可以参考这个答案,它对我起作用-