使用Spring MVC HandlerInterceptorAdapter从HttpServletResponse记录响应正文(HTML)

问题描述 投票:26回答:5

我正在尝试记录(为了简单起见,现在只是为了控制台编写)登录后,HttpServletResponse将返回最终呈现的HTML。为此,我正在使用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之类的方法。

提前感谢。

java spring spring-mvc servlets
5个回答
21
投票

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

这将涉及编写HandlerInterceptor的子类,并覆盖Filter(可能还覆盖HttpServletResponseWrapper)。这些方法将返回HttpServletResponseWrapper / getOutputStream实现,这些实现除了将响应流发送到其原始目的地之外,还从响应流中提取日志。一种简单的方法是使用getWriter()中的OutputStream,但实现自己并不难。

这是您可以做的事情的一个例子,利用Spring的PrintWriterTeeOutputStream以及TeeOutputStream,使事情变得简单:

Apache Commons IO

这会将所有内容记录到STDOUT。如果您要登录到文件,它将变得更加复杂,要确保关闭流等等,但是原理保持不变。


9
投票

如果您使用(或考虑使用)GenericFilterBean作为日志框架,则已经有一个不错的servlet过滤器可以准确地做到这一点。在DelegatingServletResponseStream中检出TeeFilter章节。


6
投票

我一直在寻找一种记录完整HTTP请求/响应的方法,发现TeeOutputStream已经为我解决了。它的工作方式与从Tomcat 7容器中公告的一样。如果要在Jetty中使用它,则该类可以很好地独立运行,或者像我一样复制并适应环境的特定需求。


1
投票

我通过Maven Central提供了一个小型库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; } }

添加到pom.xml:

logback

添加到web.xml:

documentation

添加到log4j.xml:

Tomcat 7 RequestDumperFilter

0
投票

下面粘贴的代码适用于我的测试,可以从我的spring-mvc-logger下载,在基于生产项目的解决方案上应用解决方案后可以共享

<dependency>
    <groupId>com.github.isrsal</groupId>
    <artifactId>spring-mvc-logger</artifactId>
    <version>0.2</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.