Servlet引擎在调用Servlet之前是否会读取完整的请求?

3

Servlet引擎(例如TomcatJetty)接收到HTTP请求并调用一个servlet,该servlet使用包含请求正文的HttpServletRequest对象和InputStream进行处理。

现在我想知道该引擎是否已经从网络中读取了整个请求,并且InputStream只是内存中的缓冲区,还是它只读取了请求的一部分,当servlet调用InputStream.read时,它实际上会读取套接字。

3个回答

1
通常情况下并非如此,因为请求体可能非常庞大。如果内容长度已知且足够小,则Servlet容器可以这样做。

1

至少在POST请求的情况下,它必须这样做,以便可以从请求正文中的名称-值对形成requestParameterMap。


我有所怀疑。真的需要读取整个主体来创建那张地图吗? - Michael

1
你可以阅读这篇文章。HttpServeltInputStream 从哪里读取数据?——知乎,这篇文章是我自己写的。它是用中文写的,如果你不懂中文,这里有一个简洁的结论:

enter image description here

图片来源:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html 您也可以从此问题中阅读一些Tomcat信息:什么是“Sim blocking”(在Tomcat文档中看到)? 实际上,在Tomcat中,HttpServletRequest.getInputStream会从NIOChannel(GitHub中的NIOChannel源代码)读取数据。
虽然在读取过程中使用许多缓冲区对象,但这些仍是小缓冲区。最终直接从套接字中的NIOChannel读取一点数据。

enter image description here

我们直接从 CoyoteInputStream 中读取流字节。 它 (CoyoteInputStream) 从 InputBuffer 复制或读取字节流; InputBuffer 从底层请求对象 CoyoteRequest (该类为 org.apache.coyote.Request) 中读取数据。 如果我们使用连接器 HTTP/1.1CoyoteRequestHttp11InputBuffer 中读取数据。 Http11InputBufferNIOSocketWrapper 中读取数据。 NIOSocketWrapperNIOChannel 中读取数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接