为什么HttpServletRequest的body不能被多次读取?

Him*_*rma 5 java servlets

我遇到了这个问题,我正在使用读取请求javax.servlet.http.HttpServletRequest.getReader(),然后清除请求。因此,当我在过滤器链中将其向前传递时,它会将请求传递为null传递

我能够通过以下类似的解决方案解决此问题:

如何在 Spring 'HandlerMethodArgumentResolver' 中多次读取请求正文?

我的问题是为什么我们不允许多次读取请求?

Ste*_*n C 6

为什么HttpServletRequest的body不能被多次读取?

因为这需要 servlet 堆栈缓冲整个请求主体……以防 servlet 决定重新读取它。这将影响所有请求的性能和/或内存利用率。除非有足够的内存来缓冲最大预期请求正文的多个实例(用于多个同时请求),否则它将无法工作。

请注意,除非 HTTP 请求失败,否则无法让客户端重新发送数据。即使这样,客户端也可能无法重新发送它......因为它本身可能无法缓冲数据。

简而言之:Servlet API 不支持重新读取请求正文,因为它无法扩展。如果 servlet 想要重新读取数据,它需要自己缓冲数据。