为什么 HttpServletResponse 没有响应主体的简单字符串?

Why does HttpServletResponse not have a simple String of the response body?

我一直在尝试寻找一种方法来在我的 spring 启动应用程序中记录请求的响应主体。我现在已经放弃了它,只会在返回之前登录每个控制器,因为让它工作的努力(在全球范围内,对于所有具有过滤器或请求拦截器的控制器)似乎非常大/过于复杂。

在 python django 项目中,这似乎可以像 log.info(response.body).

这样的中间件一样简单

我是 Java 的新手,所以我确信这是有充分理由的,但有人可以解释为什么吗?

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

HttpServletRequest/Response 类 旨在直接 from/to 浏览器传输数据。它们在那里处理 I/O 网络通信,但它们不需要存储整个 request/response 正文。

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

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