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

Ma9*_*9uS 8 java browser servlets http java-ee

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

我应该在响应编写器上检查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();
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,
迈克

cle*_*tus 4

处理此问题的唯一真正方法是让浏览器不断告诉您它仍然存在,例如每 5-10 秒一次。如果你走了一分钟没有听到任何声音,你就会认为客户已经离开并忘记了你在做什么。

有几种方法可以实现这一点:

  • 元刷新:我不喜欢这个,因为它对用户来说是令人不安的和显而易见的;
  • 一个 iframe 可以做到这一点(不太明显);或者
  • 一些 AJAX 技术,这可能是最好的选择。

没有真正的方法可以检测客户端是否仍在阅读您发送的内容。TCP 连接终止需要一段时间,而且到客户端的路径通常是间接的(通过代理等),因此无需检测它。