【问题标题】:How can you tell if the user hit cancel during a download from a Java servlet?如何判断用户在从 Java servlet 下载期间是否点击了取消?
【发布时间】:2011-04-10 09:43:54
【问题描述】:

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

【问题讨论】:

    标签: java servlets download request-cancelling


    【解决方案1】:

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

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


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

    【讨论】:

    • 确切的异常类是什么? (我懒得打开一些日志文件看:))
    • @Bozho:我在快速编辑过程中添加了更多细节。它是特定于 servlet 容器的。
    • 所以你说的 write 抛出异常,当它阻塞时,由于用户的取消。
    • 听起来您正在使用多个线程来写入数据。顺便说一句,这样的阻止是不正常的。
    • 不,不是。只有一根线。然而,没有你提到的写块。
    【解决方案2】:

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

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

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

    【讨论】:

    • 所以你说如果缓冲区足够大就不会出现IOException,因为写入不会阻塞。但是,我猜flush会阻塞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多