3

This is a question related to Capture and log the response body. What if I only want to log the response headers, and not the entire body? Is there a different approach than described in the linked question?

1 Answer 1

8

You'd like to override the HttpServletResponse#addHeader() and HttpServletResponse#setHeader() method instead.

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);
}

There are indeed more methods which sets the headers, but in a bit decent servletcontainer implementation they all delegate to this one method (I've verified it in both Tomcat and Glassfish).

Alternatively, you can also make use of servletcontainer specific logging capabilities. Tomcat for example seems to support logging of response headers by a valve.

Sign up to request clarification or add additional context in comments.

2 Comments

I tried this, but seems to be not working for me. stackoverflow.com/questions/42573647/…
"There are indeed more methods which sets the headers, but in a bit decent servletcontainer implementation they all delegate to this one method (I've verified it in both Tomcat and Glassfish)." Check those. Perhaps you just need to override those other methods as well for your particular servletcontainer make/version.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.