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)
谢谢,
迈克
处理此问题的唯一真正方法是让浏览器不断告诉您它仍然存在,例如每 5-10 秒一次。如果你走了一分钟没有听到任何声音,你就会认为客户已经离开并忘记了你在做什么。
有几种方法可以实现这一点:
没有真正的方法可以检测客户端是否仍在阅读您发送的内容。TCP 连接终止需要一段时间,而且到客户端的路径通常是间接的(通过代理等),因此无需检测它。
归档时间: |
|
查看次数: |
4014 次 |
最近记录: |