当servlet没有读取它时,Tomcat将先前请求的请求主体作为请求标头保持活动连接

时间:2016-01-29 09:14:43

标签: java http tomcat servlets

Tomcat将完全读取请求标头,但POST正文必须由servlet读取。

我的问题是如果servlet在没有阅读的情况下发送回复,请求正文会发生什么?对于keep alive的大多数情况,如果连接为HTTP/1.1,则会将其放弃或作为下一个请求的请求标头。

我认为nginx正确处理此方案的错误。但我没有在bz.apache.org找到任何错误报告。

在这种情况下,网络服务器的假设行为是什么?

Tomcat版本:7.0.55,请求正文与Content-Length而非chunked一起发送。

背景

我有两个POST请求都有请求体(json字符串)使用一个连接发送(HTTP/1.1默认保持活动状态),但第一个请求的servlet没有读取请求body,tomcat将此请求正文作为下一个请求标头,客户端获取HTTP/1.1 505 HTTP Version Not Supported。在tomcat的访问日志中,请求url是请求主体,是一个json字符串。

10.128.8.6 - - [29/Jan/2016:09:47:30 +0800] "POST /action1.do HTTP/1.1" 200 57
10.128.8.6 - - [29/Jan/2016:09:47:30 +0800] "[123]POST /action2.do HTTP/1.1" 505 -

1 个答案:

答案 0 :(得分:2)

如果没有读取处理请求,则丢弃正文。

这与Tomcat或servlet无关,而是与HTTP协议有关。 HTTP协议是无状态的,您询问的行为将要求服务器记住第一个请求的主体:将该信息保存为某个状态。这样做也没有意义:POST请求的主体不太可能包含可以解释为请求头的字节。

Tomcat我们不太可能有这样一个根本和破坏性的错误。如果您认为自己看到了这样的错误,那么您可能会误解某些内容。