6

如何判断用户在从 Java servlet 下载期间是否点击了取消?使用 IE 对我来说似乎发生了什么,输出流 println() 块。使用过的点击取消,但有没有办法让这个或类似的东西超时?

4

2 回答 2

5

换行OutputStream#write()#flush()#close()在一个try-catch块上IOException。如果被捕获,则通常意味着最终用户已中止请求。

为了更进一步,您还可以捕获更多特定于 servletcontainer 的异常,例如ClientAbortException在 Tomcat 和克隆(它是 的子类IOException)上,但这会使您的 webapp 代码无法移植到其他 servlet 容器。


更新:回到阻塞问题,您想flush()在写入单个数据块后调用。这实际上会将数据发送到客户端,并导致IOException底层套接字关闭。

于 2010-09-09T18:07:49.470 回答
2

你将无法确定。这取决于您的 servlet 容器是如何实现的。

当用户点击“取消”时,浏览器应该关闭套接字。当然,这将被服务器检测到,但是服务器是否有ServletOutputStream直接连接到套接字的“管道”OutputStream是依赖于实现的。如果是这样,IOException则在 servlet 下次尝试写入数据时将引发 an。

如果容器缓冲输出,则 servlet 可能刚刚完成写入数据并且永远不知道有什么问题。

于 2010-09-09T18:12:22.047 回答