2013-04-22 103 views
3

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

在发送响应的几乎同一时间,客户端与网络断开连接时存在特定的错误情况。数据被servlet写入到输出流中,并且输出流被刷新,并且定时是在输出流刷新时服务器不知道客户端未连接。 (连接被客户端和服务器之间的一个点突然切断,所以客户端没有机会正确关闭TCP连接 - 服务器没有看到TCP RST。)

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

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

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

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

回答

0

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

您不能建立对接收响应的客户端依赖于您的应用程序。这就是所谓的幂等性:查找它。

+0

EJP感谢您的回答。我想我明白贱民的想法,但是,你可以详细说明什么是“不能建立任何依赖”?我的理解不是所有的HTTP方法都需要幂等。 POST。 – prime13 2013-04-24 15:06:03