仅记录http servlet响应标头

kod*_*nja 3 java servlets http httpresponse

这是与Capture相关的问题并记录响应正文.如果我只想记录响应头而不是整个身体怎么办?是否有与链接问题中描述的方法不同的方法?

Bal*_*usC 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);
}
Run Code Online (Sandbox Code Playgroud)

确实有更多的方法来设置标题,但是在一个不错的servletcontainer实现中,它们都委托给这个方法(我已经在Tomcat和Glassfish中验证了它).

或者,您也可以使用servletcontainer特定的日志记录功能.例如,Tomcat似乎支持通过阀门记录响应头.