获取用于记录的ServletResponse内容字符串

时间:2016-05-13 07:01:37

标签: java spring logging filter servlet-filters

我有一个由Java Spring开发的RESTful服务。我在一个过滤器中创建了一些用于身份验证的过滤器,获取了一些自定义标头等等。我需要记录传入的请求和传出的响应。现在我坚持记录响应。这是过滤器

sentinel config-command mymaster <renamed-command>

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException 是获取内容所需的对象。

我知道有一些重复的问题已经回答,但由于某些原因,这些问题对我来说都不起作用。

servletResponse之后filter我想要记录响应内容的doFilter方法。

当我检查chain.doFilterJSON中的response时,我可以看到outputStream对象。但我无法以编程方式获得它。

有人可以帮我解决这个问题吗?提前谢谢!

以下是我使用过的链接,但没有帮助:

How to read and copy the HTTP servlet response output stream content for logging

Capture and log the response body

Logging response body (HTML) from HttpServletResponse using Spring MVC HandlerInterceptorAdapter

1 个答案:

答案 0 :(得分:1)

对于自定义解决方案,这是一个想法。

在过滤器中,您需要包装响应并拦截servlet的输出,以便您可以编写它。

public void doFilter(ServletRequest request, 
                     ServletResponse response, 
                     FilterChain chain) throws ServletException, IOException {

    // Wrap the response
    MyResponseWrapper responseWrapper = 
                         new MyResponseWrapper((HttpServletResponse) response);

    chain.doFilter(request, responseWrapper);
}

MyResponseWrapper是一个可以拦截对输出流的所有调用的类

public class MyResponseWrapper implements HttpServletResponse {
     private HttpServletResponse response;
     private ServletOutputStream outputStream;
     private MyOutputStreamCopier myOutputStreamCopier;

     public MyResponseWrapper(HttpServletResponse response) {
         this.response = response;
     }

     // Implements all needed methods

     // Write methods like the following to redirect output to your logs
     public ServletOutputStream getOutputStream() throws IOException {
         if (outputStream == null) {
             outputStream = getResponse().getOutputStream();
             copier = new MyOutputStreamCopier(outputStream);
         }

         return copier;
    }
}

其中MyOutputStreamCopier是扩展ServletOutputStream的自定义类,并将所有写入复制到本地缓冲区(或直接将其记录到日志文件中)。

如果您喜欢已构建的解决方案,请查看此link