使用Spring MVC HandlerInterceptorAdapter从HttpServletResponse记录响应主体(HTML)

我正在尝试记录(仅为了简单起见,现在是控制台写入)最终呈现的HTML将由HttpServletResponse返回。 (即正文)为此,我使用Spring MVC中的HandlerInterceptorAdapter,如下所示:

public class VxmlResponseInterceptor extends HandlerInterceptorAdapter { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(response.toString()); } } 

这按预期工作,我在控制台中看到HTTP响应标头。 我的问题是,是否有一种相对简单的方法可以将整个响应体(即最终呈现的HTML)记录到控制台,而无需使用PrintWriters,OutputStream等进行跳跃。

提前致谢。

使用Servlet Filter而不是Spring HandlerInterceptor可以做得更好,因为允许Filter替换请求和/或响应对象,并且您可以使用此机制将响应替换为记录响应的包装器输出。

这将涉及编写HttpServletResponseWrapper的子类,覆盖getOutputStream (可能还有getWriter() )。 除了发送到其原始目标之外,这些方法还将返回OutputStream / PrintWriter实现,这些实现将响应流虹吸到日志中。 一种简单的方法是使用Apache Commons IO中的 TeeOutputStream ,但实现起来并不难。

下面是一个你可以做的事情的例子,利用Spring的TeeOutputStreamDelegatingServletResponseStream以及TeeOutputStreamTeeOutputStream事情:

 public class ResponseLoggingFilter extends GenericFilterBean { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response); filterChain.doFilter(request, responseWrapper); } private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) { return new HttpServletResponseWrapper(response) { @Override public ServletOutputStream getOutputStream() throws IOException { return new DelegatingServletOutputStream( new TeeOutputStream(super.getOutputStream(), loggingOutputStream()) ); } }; } private OutputStream loggingOutputStream() { return System.out; } } 

这会将所有内容记录到STDOUT。 如果你想登录一个文件,它会变得更加复杂,确保流关闭等等,但原则仍然是一样的。

如果你正在使用(或考虑) logback作为你的日志记录框架,那么已经有一个很好的servletfilter就可以完成。 查看文档中的TeeFilter章节。

我一直在寻找一种方法来记录完整的HTTP请求/响应一段时间,并发现它已经在Tomcat 7 RequestDumperFilter中为我解决了。 它的工作方式与Tomcat 7容器中的广告相同。 如果你想在Jetty中使用它,这个类可以很好地独立运行,或者像我一样,复制并适应我环境的特定需求。

我通过maven central制作了一个小型的spring-mvc-logger库。

添加到pom.xml:

  com.github.isrsal spring-mvc-logger 0.2  

添加到web.xml:

  loggingFilter com.github.isrsal.logging.LoggingFilter   loggingFilter /*  

添加到log4j.xml: