最近一直在改平台的bug,其中有一个bug比较有让人感到很棘手,是说我们系统的在线人数统计出来的人数问题,随着测试的时越来越长,测试工作也做的越来越细。这个问题在先前是无法被发现的,因为谁也不知道在某一个时刻究竟有多少人在线,在前期的数据库设计时,为user表加了一个属性logingstatus来标记用记是否在线。当用户注销时,会去改变这个属性的值就行了。所以我在做在线人数统计时只需要从user表里面读出loginstatus=1的用户的个数传到前台就OK了。但上现在遇到了一些问题,很多用户都不会通过点击“注销”来退出系统,更多的是直接关掉页面更有甚者是直接关掉浏览器,这样就有问题了,因为在用户这样操作后它不会去调用上面的改变user表属性的方法。所以这样即使用户已经退出系统,但它的属性依然没有改变,这样从数据库中读出的在线人数个数就会是什么,大家可想而知!这个问题怎样解决其实不难,关键是要有一个正确的思路,在在B/S(浏览器/服务器)体系里面,系统服务器会为每一个登陆的用户指定一个SESSION,SESSION在用户登陆系统时创建,由于SESSION是放在服务器的内存当中,所以这个SESSION是不会被永远保留的,在J2EE开发中,应用服务器通常默认的session失效时间是30分钟,但是也可以在部署描述符web.xml中通过这样的一条语句来配置这个失效时间:<session-config><session-timeout>30</session-timeout></session-config>。当用户在指定的失效时间内没有向服务端提交请求,session将会被应用服务器销毁。用户必须从重新登录来获得新的session。这就是解决问题的突破口,利用SESSION!我们可以利用HttpSessionListener来监听HttpSessionEvent事件,由于不论用户是对家何种方式退出系统的,在30分钟后服务器就会使用HttpSessionEvent事件来执行sessionDestroy方法,这样我们就可以通过监听HttpSessionEvent来改变user表中的loginStatus属性了,思路就是这样的