日期:2014-05-18  浏览次数:20611 次

关于非法退出如何处理?
统计在线用户人数,用户一登陆,在线人数加一,注销时在线人数减一,如果用户直接把浏览器关了或者非法退出?
我如何才能知道?并且能够在他非法退出时,对应的在线人数减一,而不是用户已经退出了,在线人数却没有改变?
用了监听器来做处理,在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 同学已经说的很清楚了;
不是不行,是有没有必要的问题,因为你要把请求-响应 模式改变成 实时模式,开销肯定很大;