Журнал только http заголовки ответа сервлета - PullRequest
3 голосов
/ 05 августа 2010

Это вопрос, связанный с Захват и запись тела ответа . Что, если я хочу регистрировать только заголовки ответов, а не весь текст? Есть ли другой подход, чем описанный в связанном вопросе?

1 Ответ

7 голосов
/ 05 августа 2010

Вместо этого вы хотите переопределить метод 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 поддерживает регистрацию заголовков ответов с помощью клапана .

...