【问题标题】:Why does HttpServletResponse not have a simple String of the response body?为什么 HttpServletResponse 没有响应体的简单字符串?
【发布时间】:2022-01-01 20:58:43
【问题描述】:

我一直在尝试找到一种方法来在我的 Spring Boot 应用程序中记录请求的响应正文。我现在已经放弃了这个,只会在返回之前登录每个控制器,因为让它工作的努力(全局,对于所有带有过滤器或请求拦截器的控制器)似乎非常大/过于复杂。

在 python django 项目中,这似乎可以像带有 log.info(response.body) 之类的中间件一样简单。

我是 Java 新手,所以我确信这是有正当理由的,但有人能解释一下为什么吗?

要尝试在 java 中获取响应主体的字符串表示,从 HttpServletResponse 涉及到各种争论,例如 this

【问题讨论】:

  • 响应正文可能不容易获得。如果您将 4GB 文件流式传输到客户端怎么办? HttpServletResponse 也是 javax.servlet 类,所以它不是为了用户友好。基于 Spring 的方法肯定更容易实现,如果您继续进行更多搜索,我相信有人为您完成了艰苦的工作。
  • 确实有人完成了艰苦的工作。设法使用ContentCachingResponseWrapper 找到了一个基于过滤器的解决方案来完成这项工作。谢谢

标签: java spring servlets


【解决方案1】:

HttpServletRequest/Response 类旨在直接从浏览器流式传输数据/向浏览器传输数据。它们用于处理网络上的 I/O 通信,但它们不需要存储整个请求/响应主体。

这允许 servlet 直接流式传输数据,并且当您想要记录响应时,数据已经通过网络发送(嗯,除了异步处理,但这会使事情变得更加复杂) .默认实现不会知道它必须保留一份数据副本以用于日志记录。

这就是为什么您需要实现一个 Filter 来包装请求/响应以保留和记录正文,正如您在链接中指出的那样。通常,您可能希望自定义此行为以仅选择特定请求、限制大小、定义如何记录它等。因此未提供默认实现,但您有很多解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2014-04-28
    • 2018-08-07
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多