【发布时间】:2011-04-10 09:43:54
【问题描述】:
如何判断用户在从 Java servlet 下载期间是否点击了取消?使用 IE 对我来说似乎发生了什么,输出流 println() 块。使用的命中取消,但有没有办法让这个或类似的东西超时?
【问题讨论】:
标签: java servlets download request-cancelling
如何判断用户在从 Java servlet 下载期间是否点击了取消?使用 IE 对我来说似乎发生了什么,输出流 println() 块。使用的命中取消,但有没有办法让这个或类似的东西超时?
【问题讨论】:
标签: java servlets download request-cancelling
将OutputStream#write()、#flush() 和#close() 包装在try-catch 块中IOException。如果被捕获,则通常意味着最终用户已中止请求。
为了更进一步,您还可以在 Tomcat 和克隆(它是 IOException 的子类)上捕获更多特定于 servletcontainer 的异常,例如 ClientAbortException,但这会使您的 webapp 代码无法移植到其他 servletcontainers .
更新:回到阻塞问题,您想在写入单个数据块后调用flush()。这将实际上将数据发送到客户端并在底层套接字关闭时导致IOException。
【讨论】:
你无法确定。这取决于您的 servlet 容器是如何实现的。
当用户点击“取消”时,浏览器应该关闭套接字。当然,这将被服务器检测到,但是服务器是否将ServletOutputStream“探测”到套接字的OutputStream 是依赖于实现的。如果是这样,则在 servlet 下次尝试写入数据时将引发 IOException。
如果容器缓冲输出,则 servlet 可能刚刚完成写入数据并且永远不知道有什么问题。
【讨论】: