Java Tomcat是在收到post正文之前还是之后调用servlet的doPost方法?

Java Tomcat是在收到post正文之前还是之后调用servlet的doPost方法?,java,tomcat,servlets,Java,Tomcat,Servlets,当Tomcat收到一个路由到servlet的Post请求时,Tomcat是在调用servlet的handler方法之前等待获得整个Post正文,还是立即调用该方法 通过扩展HttpServlet类并实现doPost(请求、响应)方法,我创建了一个简单的servlet。在我的方法中,我调用request.getInputStream()通过输入流检索帖子正文 假设客户端正在发布一个非常大的对象,并且在上传过程中,客户端中止了上传,或者他们的internet连接失败。在这种情况下,是否永远不会调用我

当Tomcat收到一个路由到servlet的Post请求时,Tomcat是在调用servlet的handler方法之前等待获得整个Post正文,还是立即调用该方法

通过扩展
HttpServlet
类并实现
doPost(请求、响应)
方法,我创建了一个简单的servlet。在我的方法中,我调用
request.getInputStream()
通过输入流检索帖子正文

假设客户端正在发布一个非常大的对象,并且在上传过程中,客户端中止了上传,或者他们的internet连接失败。在这种情况下,是否永远不会调用我的
doPost
方法?或者它会被调用,但在读取输入流的过程中失败


这种差异对我来说很重要,因为我想知道我是否能够在输入流读取期间捕获
IOException
,并在那里采取一些措施。

查看Tomcat源代码,我们看到默认的
servelInputStream
实现是
CoyoteInputStream
,它从
org.apache.catalina.connector.InputBuffer的实例
。此缓冲区具有各种特定于协议的扩展类。调用
doPost()
之前完全读取的请求正文似乎是一个实现细节,具体取决于使用的协议,例如,对于
StreamInputBuffer
类中的HTTP2,我们看到以下注释:

需要两个缓冲区来避免各种多线程问题。 这些问题产生于以下事实:流(或 应用程序使用的请求/响应)在一个线程中处理 但连接是在另一个系统中处理的。因此这是可能的 可以在应用程序之前接收请求主体帧 我准备好读了。如果未对其进行缓冲,则 连接(以及所有流)将阻塞,直到应用程序 读取数据。因此,必须缓冲传入的数据。 如果只使用了一个缓冲区,那么如果 连接线程正在尝试与 应用程序正在读取它。而这应该是可以避免的 由于小心使用缓冲区,因此仍需要 与使用两个缓冲区相同的副本,其行为将更少 清楚

这适用于其他servlet容器,例如JBoss WildFly可以在完全读取请求正文之前开始执行
doPost()
,这取决于连接是否可以挂在内部。

读取正文之前将调用
doPost()
方法

在通常的POST请求中,当您调用
request.getParameter(..)
.getParameterNames()
.getPart(..)
.getParts()
时,将读取并使用正文。如果能够调用
request.getInputStream()
,则表示尚未读取正文


使用HTTP/1.1协议,如果客户端使用
Expect
头请求确认,服务器可以向客户端发送确认(
100 Continue
)。这发生在阅读正文之前。

感谢您的热烈响应。我通过中止一些大型上传来测试这一点,发现确实,在上传过程中调用了我的函数,当我尝试读取流时,我得到了一个IOException。这正是我所希望的。严格来说,这不是真的-
doPost
肯定是在读取整个请求之前调用的,但不能保证没有读取正文的任何部分。