gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:52:48 27 4
gpt4 key购买 nike

我正在尝试记录(为了简单起见,现在只是为了控制台编写)将由 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 响应 header 。我的问题是是否有一种相对简单的方法可以将整个响应正文(即最终呈现的 HTML)记录到控制台,而不必借助 PrintWriters、OutputStream 等进行跳跃插孔。

提前致谢。

最佳答案

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

这将涉及编写 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。如果你想记录到一个文件,它会变得更加复杂,需要确保流关闭等等,但原理保持不变。

关于java - 使用 Spring MVC HandlerInterceptorAdapter 从 HttpServletResponse 记录响应正文 (HTML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61656876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com