2

java servlet有没有办法检查httpresponse是否仍然“活着”?例如,在我的情况下,我将 ajax 请求从浏览器发送到 servlet。在这种情况下,它是一个轮询请求,因此它可能会轮询长达 5 分钟,当 servlet 准备好响应数据时,我想检查用户是否关闭了浏览器窗口或移动到另一个页面等。换句话说,检查发送数据到响应是否真的会做任何事情。

4

2 回答 2

0

Java Servlet Response 没有任何这样的方法,因为它基于请求和响应行为。如果您想检查状态,那么您可能需要在较低级别工作,例如TCP/IP Sockets,它有以下几种状态检查方法:

boolean isBound()
Returns the binding state of the socket.

boolean isClosed()
Returns the closed state of the socket.

boolean isConnected()
Returns the connection state of the socket.

boolean isInputShutdown()
Returns whether the read-half of the socket connection is closed.

boolean isOutputShutdown()
Returns whether the write-half of the socket connection is closed.
于 2012-11-02T03:58:01.503 回答
0

通常,可以通过在实际消息之前发送一个虚拟有效负载来解决此问题。

如果套接字被切断,则抛出 anIOException或 aSocketException或类似的东西(取决于库)。从技术上讲,浏览器应该在您离开页面或关闭浏览器(或任何类似的东西)时切断连接,但我发现实现细节可能会有所不同。例如,旧版本的 FF 在离开页面时会适当地关闭连接,但新版本(尤其是在使用 AJAX 时)倾向于保持连接打开。

这是您可以在实际消息之前使用虚拟数据包的主要原因。另一个重要的考虑因素是超时。我之前做过轮询,您要么需要实现某种心跳来保持连接处于活动状态,要么增加服务器超时(尽管请记住,某些浏览器也可能有超时 - 您无法控制的超时)。

我强烈建议尝试(至少部分)支持 Websocket 解决方案,而不是轮询或推送 AJAX。

于 2012-11-02T03:59:21.067 回答