java servlet引擎在调用servlet之前读取整个请求吗?

yxyvkwin  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(109)

Servlet引擎(例如TomcatJetty)接收HTTP请求,并使用HttpServletRequest对象调用servlet,该对象包含请求主体的InputStream
现在我想知道引擎是否已经从网络读取了 * 整个 * 请求,InputStream只是内存中的一个缓冲区,或者它已经读取了 * 部分 * 请求,当servlet调用InputStream.read时,它 * 实际上 * 读取了套接字。

4dc9hkyq

4dc9hkyq1#

通常情况下不是这样的,因为请求正文可能非常大。如果内容长度已知并且足够小,servlet容器可能会这样做。

j7dteeu8

j7dteeu82#

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

pgccezyw

pgccezyw3#

where does the HttpServeltInputStream read from — Zhihu,这篇文章是我自己写的,是用中文写的,如果你不懂中文,这里有一个简洁的结论:

图片来源:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html
你也可以从这个问题中读到一些tomcat的信息:What is "Sim blocking" (seen in tomcat doc)?
实际上,在tomcatHttpServletRequest.getInputStream中将从NIOChannel(NIOChannel source code in github)读取数据。
虽然在读取过程中使用了许多缓冲区对象,但这些缓冲区仍然很小,最终只是从套接字直接从NIOChannel读取一些数据

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

相关问题