3

これは、応答本文のキャプチャとログ記録に関連する質問です。本文全体ではなく、応答ヘッダーのみをログに記録したい場合はどうなりますか?リンクされた質問で説明されているものとは異なるアプローチはありますか?

4

1 に答える 1

7

HttpServletResponse#addHeader()代わりにandHttpServletResponse#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 実装では、それらはすべてこの 1 つのメソッドに委任されます (Tomcat と Glassfish の両方で確認しました)。

または、サーブレットコンテナ固有のロギング機能を利用することもできます。たとえば、Tomcat は、バルブによる応答ヘッダーのロギングをサポートしているようです。

于 2010-08-05T13:41:30.250 に答える