日期:2014-05-17  浏览次数:20604 次

问一个在线人数的问题。
如题,我后台是这样的,每登陆一个人,就把他的信息压到ConcurrentHashMap<String, HttpSession> sessionMap 里。

注销用户就sessionMap.remove掉登陆账号。


然后 session.setAttribute("sm", sessionMap.size()); 


Jsp通过${sm}就可以取到在线人数。


问题就在,登陆了2个用户,A登陆的显示1人,B登陆的显示2人,A用户刷新页面也显示1,如何修改代码?

------解决方案--------------------
session.setAttribute("sm", sessionMap.size()); 

不用session,用application
------解决方案--------------------
直接定义一个全局静态变量,然后在页面引用这个变量即可,不用保存在session中
------解决方案--------------------
Application存全局 Session事件监听 即可
------解决方案--------------------
ConcurrentHashMap<String, HttpSession> sessionMap把这个变量定义成类变量
即加static修饰符
------解决方案--------------------
类属性是放在堆内存里面的,是唯一的一旦有哪个操作改变了这个类属性,任何访问这个类属性的操作都是访问的这个值最后一次被改的值
------解决方案--------------------
session.setAttribute("sm", sessionMap.size()); 
这句话是不是只是在登录和注销的时候被执行?如果是的话,你刷新页面的话你这段代码没有被执行啊,那当然获得值不是最新的咯,你放在ServletContent里面就可以了。
this.getServletContext().setAttribute("msg", sessionMap.size());
------解决方案--------------------
监听浏览器是否关闭确实是见很麻烦的事情,可以在页面写js在关闭时发送销毁session的请求。但如果是浏览器异常关闭的话,作用就不明显了。
------解决方案--------------------
使用数据库,每登陆一个人数据库的值加1,登出或session time out就减1,使用楼主的办法,如果是多个tomcat同时工作应该会有问题的。
------解决方案--------------------
要搞个contextlister