如何判断用户在从Java servlet下载时是否取消了取消? IE似乎发生了什么,输出流println()阻塞。用过的命中取消了,但有没有办法计算出这个或类似的东西?
答案 0 :(得分:4)
将OutputStream#write()
,#flush()
和#close()
包裹在try-catch
的{{1}}块中。如果被捕获,则通常意味着最终用户已中止请求。
为了更进一步,您还可以在Tomcat和clones(它是IOException
的子类)上捕获更多特定于servlet容器的异常,例如ClientAbortException
,但这将使您的webapp代码对其他servletcontainers无法移植。
更新:要回到阻止问题,您需要在编写单个数据块后调用IOException
。这将实际将数据发送到客户端,并在底层套接字关闭时导致flush()
。
答案 1 :(得分:2)
你无法确定。这取决于servlet容器的实现方式。
当用户点击“取消”时,浏览器应该关闭套接字。当然,服务器可以检测到这一点,但是服务器是否将ServletOutputStream
“直接”连接到套接字OutputStream
是依赖于实现的。如果是,则在下次servlet尝试写入数据时将引发IOException
。
如果容器缓冲输出,servlet可能只是完成数据写入,并且永远不会知道任何错误。