这将更好地使用Servlet
Filter而不是Spring
HandlerInterceptor,因为允许过滤器替换请求和/或响应对象,您可以使用此机制用响应记录响应的包装器替换响应输出。
这将涉及编写一个HttpServletResponseWrapper的子类,覆盖getOutputStream(也可能还有getWriter())。这些方法将返回OutputStream / PrintWriter实现,将响应流虹吸到日志中,以及发送到其原始目标。一个简单的方法是使用Apache Commons IO从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。如果你想记录到一个文件,它会得到一个更大的更复杂,确保流关闭等等,但原则保持不变。