使用Servlet
Filter而不是Spring
会更好
HandlerInterceptor,因为
Filter允许a
替换请求和/或响应对象,并且您可以使用此机制用记录响应输出的包装器替换响应。
这将涉及编写的子类
HttpServletResponseWrapper,并重写
getOutputStream(也可能是
getWriter())。这些方法将返回
OutputStream/
PrintWriter实现,除了将响应流发送到其原始目的地之外,还将响应流虹吸到日志中。一个简单的方法是
TeeOutputStream从Apache Commons
IO使用,但是实现自己并不难。
这是您可以做的事情的一个示例,利用Spring的
GenericFilterBean和
DelegatingServletResponseStream以及
TeeOutputStream使事情变得更容易:
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。如果要登录到文件,它将变得更加复杂,要确保关闭流等等,但是原理保持不变。



