我正在尝试记录(为了简单起见,现在只是为了控制台编写)登录后,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之类的方法。
提前感谢。
最好使用Servlet Filter
而不是Spring Filter
,因为允许HandlerInterceptor
替代请求和/或响应对象,并且您可以使用此机制替代使用包装程序记录响应输出的响应。
这将涉及编写HandlerInterceptor
的子类,并覆盖Filter
(可能还覆盖HttpServletResponseWrapper
)。这些方法将返回HttpServletResponseWrapper
/ getOutputStream
实现,这些实现除了将响应流发送到其原始目的地之外,还从响应流中提取日志。一种简单的方法是使用getWriter()
中的OutputStream
,但实现自己并不难。
这是您可以做的事情的一个例子,利用Spring的PrintWriter
和TeeOutputStream
以及TeeOutputStream
,使事情变得简单:
Apache Commons IO
这会将所有内容记录到STDOUT。如果您要登录到文件,它将变得更加复杂,要确保关闭流等等,但是原理保持不变。
如果您使用(或考虑使用)GenericFilterBean
作为日志框架,则已经有一个不错的servlet过滤器可以准确地做到这一点。在DelegatingServletResponseStream
中检出TeeFilter章节。
我一直在寻找一种记录完整HTTP请求/响应的方法,发现TeeOutputStream
已经为我解决了。它的工作方式与从Tomcat 7容器中公告的一样。如果要在Jetty中使用它,则该类可以很好地独立运行,或者像我一样复制并适应环境的特定需求。
我通过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
下面粘贴的代码适用于我的测试,可以从我的spring-mvc-logger下载,在基于生产项目的解决方案上应用解决方案后可以共享
<dependency>
<groupId>com.github.isrsal</groupId>
<artifactId>spring-mvc-logger</artifactId>
<version>0.2</version>
</dependency>