3

我有一个处理来自客户端的 HTTP GET 请求的 java servlet。处理完请求后,它会发回 HTTP 200 OK,响应中包含几百字节的数据。

有一个特定的错误情况,即客户端几乎在发送响应的同时与网络断开连接。数据由servlet写入输出流,输出流被flush,时序是flush输出流的时候,server不知道client没有连接。(连接被客户端和服务器之间的某个点突然切断,因此客户端没有机会正确关闭 TCP 连接 - 服务器看不到 TCP RST。)

问题是,servlet 有没有办法检测到这种情况?我已经检查了两件事:

  1. 我没有在 servlet 中抛出任何异常。我希望这种情况会导致 IOException ,但这似乎没有发生。
  2. 我在用于写入客户端的 PrintWriter 上调用 PrintWriter.checkError(),即使发生此错误情况,它也会返回 false(无错误)。

据我所知,服务器没有办法知道这种情况发生。但在我看来,这应该是可能的,因为缺乏来自客户端 TCP 堆栈的确认。但也许这并没有暴露给 servlet。

不确定是否重要,但我使用的是 Tomcat 7.0.26。

4

1 回答 1

0

它不能。响应可能完全由容器缓冲,并且仅在您的 Servlet 代码退出后写入。

您不得在您的应用程序中建立对接收响应的客户端的任何依赖。这称为幂等性:查一下。

于 2013-04-22T23:20:17.787 回答