Servlet引擎(例如Tomcat或Jetty)接收HTTP请求,并使用HttpServletRequest对象调用servlet,该对象包含请求主体的InputStream。现在我想知道引擎是否已经从网络读取了 * 整个 * 请求,InputStream只是内存中的一个缓冲区,或者它已经读取了 * 部分 * 请求,当servlet调用InputStream.read时,它 * 实际上 * 读取了套接字。
Tomcat
Jetty
HttpServletRequest
InputStream
InputStream.read
4dc9hkyq1#
通常情况下不是这样的,因为请求正文可能非常大。如果内容长度已知并且足够小,servlet容器可能会这样做。
j7dteeu82#
它必须这样做,至少在POST的情况下是这样,这样它就可以从请求主体中的名称-值对形成requestParameterMap。
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
InputBuffer
CoyoteRequest
org.apache.coyote.Request
Http11InputBuffer
HTTP/1.1
NIOSocketWrapper
NIOChannel
3条答案
按热度按时间4dc9hkyq1#
通常情况下不是这样的,因为请求正文可能非常大。如果内容长度已知并且足够小,servlet容器可能会这样做。
j7dteeu82#
它必须这样做,至少在POST的情况下是这样,这样它就可以从请求主体中的名称-值对形成requestParameterMap。
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
)CoyoteRequest
从Http11InputBuffer
读取数据:HTTP/1.1
Http11InputBuffer
从NIOSocketWrapper
读取数据NIOSocketWrapper
从NIOChannel
读取数据