再次征求解答,连接servlet的浏览器关闭后引发的思考

cloudstrife 2002-03-12 10:28:29
上次我提过一次类似的问题,有朋友让我用httpsessionlistener这个interface来监视servlet跟浏览器的连接情况。但是我尝试了一下,不知道具体怎么用这个interface来完成,是否需要在servlet容器里注册(tomcat4.0)。
因为我的程序里,每次用户连接servlet后,需要完成一个近20分钟的操作(从网上取数据),因此如果在这之间用户关掉浏览器,或者系统崩溃。我需要程序能够捕捉这一事件,但是不知道怎么来实现。
现在的想法是1.servlet定时地与连接用户取得某种数据联系,以知道当前用户没有关闭连接。
2.或者servlet自身的方法来测试用户的连接状态。

谢谢各位高手踊跃回答,高分征求,如有满意答案,另外再加分。
...全文
51 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cloudstrife 2002-03-17
噢,有点道理,let me try
回复
cloudstrife 2002-03-17
是啊,但是我在取数据的时候并没向浏览器传数据,而是将数据的处理结果传送给浏览器,所以有个先后顺序。
回复
jimjxr 2002-03-17
你是想在取数据时监视浏览器是否关闭好及时中止吗?如果是这样我觉得除了写outputstream试验以外好像没有别的办法。
回复
jimjxr 2002-03-16
你所指的保护是什么?out.flush()只不过是要求把缓存都写到接受端,并不是只有out.flush()才会输出。如果缓存满了,就会自动往客户端写的。
回复
zfluo 2002-03-15
你是真的很想知道答案的话,应该去研究TCP/IP协议,
看一看server是怎样和client进行通信的
回复
cloudstrife 2002-03-15
没有吧,至少service()是受保护的。而且dopost()里面只有用out.flush()才会输出到浏览器。
回复
shine_car 2002-03-14
上次说的httpsessionlistener这个interface是可以弄到用户关闭浏览器这类情况的,它有一个sessionDestroyed(HttpSessionEvent se)事件,从se中可以有
HttpSession ses=se.getSession();String userL=(String)ses.getAttribute("acount");这样就可以知道是哪个帐号被destroyed。
其实在sun的petStore1.3以上版本就有关于httpsessionlistener的运用,不过它只用了sessionCreated(HttpSessionEvent se)这个方法,在web.xml中可以看到对这个listener的部署。具体的实现类你可看看petstore的ServiceLocator,ServiceLocatorImpl, ShoppingClientServiceLocatorImpl这三个类
哈哈你的问题还没搞定吗?偶没用过tomcat呀!不知怎么配!
回复
SuperMMX 2002-03-14
>>我想即使这个时候客户端连接断掉,也应该有时间将数据保存下来

请问你这个是什么意思? 你的目标应该更明确一点.
回复
cloudstrife 2002-03-14
我的数据传输是在dopost()里完成的,我想是不是dopost()没结束完,servlet不会释放这个线程。那么我想即使这个时候客户端连接断掉,也应该有时间将数据保存下来。
不知道我的理解有没有问题。
回复
jimjxr 2002-03-14
如果关闭后servlet还试图往客户端写东西就会出错,dopost就中止了,dopost没什末神秘的,就是一个方法而已。
回复
cloudstrife 2002-03-14
我这个程序是用servlet端来取路由器的信息,由于取table的时候时间很长,所以这个dopost()方法将运行很长时间。而如果在这个期间用户将浏览器关闭,是不是会因此(或者由于超时)而导致servlet暂停这次的dopost操作。
或者dopost()是个原子操作,系统不能在dopost运行阶段关闭它。
回复
jimjxr 2002-03-13
要用HttpSessionListener的话需要在你的web.xml中声明。但是我还是觉得这个对你这种情况没用,当客户取数据时是你的servlet通过流在给客户传数据吧,如果这时连接断了应该抛出IOException的,你捕捉这个IOException就能知道传输断掉了。
回复
luckystar_007 2002-03-13
以前,这一问题也曾经引起我的浓厚兴趣,大家共同探讨吧。
建议您看一下:《Java Servlet Servlet 编程指南》(科学出版社)
的 会话管理 的 会话事件部分,
其中有较详细的代码,
若您找不到这本书,我这里则简单解释一下:
Servlet API 中包含 HttpSssionBindingListener 接口,有两个方法 valueBound 和 valueUnbound ,Session 关闭后的动作可以安排在 valueUnbound 方法中。
例如:
public class SesionObject implements HttpSessionBindingListener
{
public void valueUnbound(HttpSessionBindingEvent event){
...
}

}

...
public class Binder extends HttpServlet{

...
public void doGet(HttpServletRequest req,HttpServletResponse res) {
...

HttpSession session=req.getSession(true);
SessionObject o=new SessionObject();
session.putValue("Binder.object",o);
...

}


}
回复
cloudstrife 2002-03-13
没人关注吗?
回复
SuperMMX 2002-03-13
你的问题是在数据传输过程中客户端断掉了, 所以会抛出异常, 具体是什么异常就不清楚了, 肯定是跟
io 有关的 :) 而不是什么 session 超时.
回复
cloudstrife 2002-03-13
没有其他的建议吗?
回复
cloudstrife 2002-03-13
或者设个定时器,定时发数据给客户端,然后检查ioexception,来捕捉。
回复
cloudstrife 2002-03-13
没有,servlet负责取数据,然后在客户端完成数据显示。不需要传很多数据到客户端。但是我担心的问题是,当一个用户连接servlet,并在service()方法里取数据,但是这个时候用户突然关闭浏览器,那么这个连接应该会timeout的吧,但我不知道如何能及时地知道这个用户已经关闭了这次的连接。
回复
发帖
非技术区
创建于2007-09-28

2.3w+

社区成员

Java 非技术区
申请成为版主
帖子事件
创建了帖子
2002-03-12 10:28
社区公告
暂无公告