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

2022-09-01 15:43:41

我正在尝试记录(只是为了简单起见,现在只是为了控制台编写)将由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等进行跳插拔。

提前致谢。


答案 1

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

这将涉及编写 HttpServletResponseWrapper 的子类,覆盖(可能还有 )。这些方法将返回 /实现,这些实现将响应流虹吸到日志中,此外还会发送到其原始目标。一个简单的方法是使用Apache Commons IOTeeOutputStream,但自己实现并不难。getOutputStreamgetWriter()OutputStreamPrintWriter

下面是一个你可以做的事情的例子,利用Spring的和,以及,使事情变得更容易:GenericFilterBeanDelegatingServletResponseStreamTeeOutputStream

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。如果你想记录一个文件,它会变得更加复杂,确保流被关闭等等,但原则保持不变。


答案 2

如果您使用(或考虑)logback 作为日志记录框架,那么已经有一个很好的 servlet 过滤器可以做到这一点。请查看文档中的 TeeFilter 一章。


推荐