java response 返回html_java – 使用Spring MVC从HttpServletResponse记录响应体(HTML)HandlerInterceptorAdapter...

这篇博客建议使用Servlet Filter而非Spring HandlerInterceptor来记录HTTP响应体,特别是当需要处理HTML内容时。通过创建HttpServletResponseWrapper子类并覆盖getOutputStream()方法,可以实现将响应输出重定向到日志。文中给出了一个使用Spring的GenericFilterBean和DelegatingServletResponseStream以及TeeOutputStream的例子,实现了将响应内容同时输出到标准输出和原始目的地。
摘要由CSDN通过智能技术生成

这将更好地使用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。如果你想记录到一个文件,它会得到一个更大的更复杂,确保流关闭等等,但原则保持不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值