微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 浏览器关闭时Servlet长时间处理取消

我有一个servlet,它长时间处理请求.它假设
继续在doPost内部循环中执行操作并通过发送数据
响应出来的作家.有效地连续追加数据
客户浏览器.
但是当客户端关闭浏览器时问题就出现了.尽管
断开的连接响应的servlet中的编写器流
永远不会关闭,因此servlet不知道brocen连接,
并保持数据转储到编写器没有任何错误.那个怎么样
posssible?我如何检测和取消长请求处理
浏览器断开的情况?

我应该在响应编写器上检查checkerror()应该做的伎俩,但它不会缝合工作.有什么想法吗?

这是永远不会停止的servlet代码

protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException
{
   HttpSession session = request.getSession();
   System.out.println("Session " + session.getId() + " started");

   response.setContentType("text/html;charset=UTF-8");

   PrintWriter out = response.getWriter();
   try
   {
       while (!out.checkerror())
       {
           try
           {
               Thread.sleep(1000);
           } catch (InterruptedException ex)
           {
               ex.printstacktrace();
           }

           Date date = new Date();

           // Todo append output to the client browser here
           out.println(".....");

           System.out.println("Session " + session.getId() + "data sent at: " + date);

           out.flush();
       //break;  // _TEST
       }
   } finally
   {
       System.out.println("Session " + session.getId() + " finished");
       out.close();
   }
}

谢谢,
麦克风

解决方法

解决这个问题的唯一真正方法是让浏览器不断告诉你它仍然在那里,比如说每5-10秒.如果你在没有听到任何声音的情况下走了一分钟,你就会认为客户已经离开并忘记了你在做什么.

有几种方法可以实现这个:

>元刷新:我不喜欢这个,因为它对用户来说是令人不安和明显的;
>这样做的iframe(不太明显);要么
>一些AJAX技术,这可能是最好的选择.

没有真正的方法可以检测客户端是否仍在阅读您发送的内容. TCP连接死亡需要时间,而客户端的路径通常是间接的(通过代理等等),所以忘记检测它.

原文地址:https://www.jb51.cc/java/128821.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐