统计在线用户人数,用户一登陆,在线人数加一,注销时在线人数减一,如果用户直接把浏览器关了或者非法退出?
我如何才能知道?并且能够在他非法退出时,对应的在线人数减一,而不是用户已经退出了,在线人数却没有改变?
用了监听器来做处理,在sessionDestroyed方法定义:
- Java code
public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 取得登录的用户名 String username = (String) session.getAttribute("username"); List<String> users=(List) application.getAttribute("users"); users.remove(username); System.out.println("非法退出,注销此用户:"+username); }
在调用session.invalidate();会自动执行此方法,但如果我直接关闭浏览器,这个方法不会被执行!求救高手了!
------解决方案--------------------
你非要这么做也不是不可以
把session时间设置得非常非常短;例如10秒;
然后写一个js,用ajax在后台,定时(每2秒)刷一个心跳页面用来维持session的时效;
这样用户不管什么原因,只要那个页面关掉了,js脚本就不会被执行,没有心跳,10秒后自然就下线了
这样可以解决用户在这个页面但是很久不动作的情况
但是有对于管服务器还是客户端开销增加的弊端
------解决方案--------------------
刚没注意看,benjamin_liu 同学已经说的很清楚了;
不是不行,是有没有必要的问题,因为你要把请求-响应 模式改变成 实时模式,开销肯定很大;