【问题标题】:Log only http servlet response headers仅记录 http servlet 响应标头
【发布时间】:2011-03-25 19:22:08
【问题描述】:

这是一个与Capture and log the response body 相关的问题。如果我只想记录响应标头而不是整个正文怎么办?是否有与链接问题中描述的方法不同的方法?

【问题讨论】:

    标签: java http servlets httpresponse


    【解决方案1】:

    您想改写 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 似乎支持通过 valve 记录响应标头。

    【讨论】:

    • 非常感谢@BalusC。像魅力一样工作:)。
    • 我试过这个,但似乎不适合我。 stackoverflow.com/questions/42573647/…
    • “确实有更多方法可以设置标头,但在有点体面的 servletcontainer 实现中,它们都委托给这个方法(我已经在 Tomcat 和 Glassfish 中验证过)。” 检查那些。也许您只需要为您的特定 servletcontainer make/version 覆盖这些其他方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多