仅记录HTTP Servlet响应头

3

这是一个与捕获和记录响应正文相关的问题。如果我只想记录响应头而不是整个正文,是否有不同的方法可以使用,而不是链接中描述的方法?

1个回答

8

您希望覆盖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);
}

确实有更多设置头部的方法,但在一个相当不错的servlet容器实现中,它们都委托给这个方法(我已经在Tomcat和Glassfish中验证过)。

或者,您还可以利用特定于servlet容器的日志记录功能。例如,Tomcat似乎支持通过valve记录响应头。


我尝试了这个,但似乎对我没有用。http://stackoverflow.com/questions/42573647/httpresponse-headers-in-servlet-or-filter-or-listener - seba_sencha
确实有更多的方法可以设置头信息,但在一个相当不错的Servlet容器实现中,它们都委托给这个方法(我已经在Tomcat和Glassfish中验证过)。“检查一下。也许你只需要针对你特定的Servlet容器制作/版本覆盖这些其他方法。” - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接