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