【问题标题】:Does a servlet container wait for complete HTTP request to be received before it calls doPost?servlet 容器在调用 doPost 之前是否等待接收到完整的 HTTP 请求?
【发布时间】:2014-03-26 17:00:37
【问题描述】:

servlet 容器何时调用方法 doPost / doGet?它是否在开始处理之前等待接收来自 Web 客户端的完整请求。还是在接收到 HTTP 标头并识别 HTTP 请求的方法(POST、GET 等)之后调用方法(doPost 或 doGet)?

我的问题与以下链接中的问题完全相同: Does servlet engine read the whole request before calling a servlet?

但除此之外,假设 servlet 容器将在识别 HTTP 方法和内容长度后立即调用方法 doPost / doGet,如果 Web 客户端在完整的 HTTP 请求发送到 Web 服务器之前终止会发生什么/servlet 容器。 servlet 线程如何知道收到的请求未完成。

【问题讨论】:

  • 这不是 Servlet 规范中指定的。每个 Servlet 容器都可以选择以任何他们想要的方式实现该行为。您想了解哪个 Servlet 容器?
  • 我有兴趣了解 Tomcat。
  • 这是为了回答我自己的问题 - servlet 线程如何知道收到的请求未完成?
  • 当servlet容器收到HTTP头时,根据收到的HTTP头调用doPost/doGet方法。它不会等待接收到完整的请求(如内容长度所示)。如果应用程序开发人员调用了 getParameter 或其变体,那么此时,此方法将等待,直到收到完整的请求。如果 Web 客户端在未发送完整请求的情况下关闭,则 getParameter 返回 null。应用程序开发人员需要明确处理这种情况。
  • 我个人的看法是,getParameter应该有办法判断是网络I/O错误,而不是返回null。抛出异常更好。有什么想法吗?

标签: java jsp servlets


【解决方案1】:

好吧,我认为没有收到完整的内容,你得到的是一个可以从中读取内容的流。

servlet 线程如何知道收到的请求未完成。

你有内容长度,这就是容器在请求时必须从流中读取的长度,如果流由于某种原因不可用,容器将抛出异常。如果您收到所有数据后客户端断开连接也是如此;在您回信之前,您不会知道客户端已断开连接。

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2020-03-04
    • 2019-03-26
    • 1970-01-01
    • 2020-10-20
    • 2012-12-24
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多