2010-08-05 52 views

回答

7

您想改写HttpServletResponse#addHeader()HttpServletResponse#setHeader()方法。

public void doFilter(ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    final Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
    chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) { 
     @Override public void setHeader(String name, String value) { 
      List<String> values = new ArrayList<String>(); 
      values.add(value); 
      headers.put(name, values); 
      super.setHeader(name, value); 
     } 

     @Override public void addHeader(String name, String value) { 
      List<String> values = headers.get(name); 
      if (values == null) { 
       values = new ArrayList<String>(); 
       headers.put(name, values); 
      } 
      values.add(value); 
      super.addHeader(name, value); 
     } 
    }); 
    logger.log(headers); 
} 

确实有更多的方法这台头,但有点像样servletcontainer实现他们都委托给此方法(我在Tomcat和GlassFish验证它)。

或者,您还可以使用servletcontainer特定的日志记录功能。例如Tomcat似乎支持valve的响应头的日志记录。

+0

非常感谢,@BalusC。奇迹般有效 :)。 – kodeninja 2010-08-13 08:12:05

+0

我试过这个,但似乎不适合我。 http://stackoverflow.com/questions/42573647/httpresponse-headers-in-servlet-or-filter-or-listener – 2017-03-03 12:55:02

+0

*“确实有更多的方法设置标题,但在一个体面的servletcontainer实现中,它们都委托到这一个方法(我已经在Tomcat和Glassfish验证了它)。“*检查这些。也许你只需要重写这些其他方法以及你的特定servletcontainer make/version。 – BalusC 2017-03-03 17:19:15