为什么HttpServletRequest的body不能被多次读取?
Why can the body of the HttpServletRequest not be read multiple times?
我遇到了这个问题,我正在使用 javax.servlet.http.HttpServletRequest.getReader()
读取请求,然后它正在清除请求。所以当我在过滤器链中向前传递它时,它传递的请求是 null
我能够通过以下类似的解决方案解决此问题:
我的问题是为什么不允许我们多次读取请求?
Why can the body of the HttpServletRequest not be read multiple times?
因为这需要 servlet 堆栈缓冲整个请求主体...以防 servlet 决定 re-read 它。这将是所有请求的性能 and/or 内存利用率。除非有足够的内存来缓冲最大预期请求主体的多个实例(对于多个同时请求),否则它不会工作。
请注意,除非 HTTP 请求失败,否则无法让客户端重新发送数据。即使那样,客户端也可能无法重新发送它...因为它可能无法自己缓冲数据。
简而言之:servlet API 不支持重新读取请求正文,因为它无法缩放。如果一个 servlet 想要重新读取数据,它需要缓冲它自己。
我遇到了这个问题,我正在使用 javax.servlet.http.HttpServletRequest.getReader()
读取请求,然后它正在清除请求。所以当我在过滤器链中向前传递它时,它传递的请求是 null
我能够通过以下类似的解决方案解决此问题:
我的问题是为什么不允许我们多次读取请求?
Why can the body of the HttpServletRequest not be read multiple times?
因为这需要 servlet 堆栈缓冲整个请求主体...以防 servlet 决定 re-read 它。这将是所有请求的性能 and/or 内存利用率。除非有足够的内存来缓冲最大预期请求主体的多个实例(对于多个同时请求),否则它不会工作。
请注意,除非 HTTP 请求失败,否则无法让客户端重新发送数据。即使那样,客户端也可能无法重新发送它...因为它可能无法自己缓冲数据。
简而言之:servlet API 不支持重新读取请求正文,因为它无法缩放。如果一个 servlet 想要重新读取数据,它需要缓冲它自己。