获取用于日志记录的 ServletResponse 内容字符串 [重复]

Posted

技术标签:

【中文标题】获取用于日志记录的 ServletResponse 内容字符串 [重复]【英文标题】:get ServletResponse content string for logging [duplicate] 【发布时间】:2016-09-09 06:05:56 【问题描述】:

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

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException 

servletResponse 是我需要获取内容的对象。

我知道已经回答了一些重复的问题,但由于某种原因,这些问题都不适合我。

我有一个filterdoFilter 方法,在chain.doFilter 之后我想记录响应内容。

当我在outputStreamwriter 中检查response 时,我可以看到JSON 对象。但我无法以编程方式获得它。

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

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

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

【问题讨论】:

您是否已经尝试过?你有一些代码吗? 我将编辑我的问题,并将包含我尝试过但没有帮助的所有代码 第一个链接到底是怎么失效的? 这是帮助我的答案,谢谢@David。 ***.com/a/8972088/1194908 【参考方案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

【讨论】:

Lorenzo 如何获取doFilter后的内容? @Armen 基本上 MyOutputStreamCopier 需要缓冲发送到输出的数据,因此您可以稍后使用它们。可能您可以添加一个方法 String getOutputContent() 以将内容作为字符串检索。否则,您可以直接在 MyOutputStreamCopier 类的日志文件中写入。

以上是关于获取用于日志记录的 ServletResponse 内容字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java面试总结2

javaWEB中的ServletRequest,ServletResponse的使用,及简化Servlet方法

如何从 Hibernate Criteria API 获取 SQL(*not* 用于日志记录)

ServletResponse接口提供的两种输出流

第一个web程序(ServletRequest , ServletResponse)

logging获取日志