spring mvc架构,tomcat运行的web项目,需要统计系统在线用户人数。在网上找的资料,很多都是使用HttpSessionListener监听session的创建和销毁来实现,session创建则人数+1,session销毁则人数-1,人数存放在ServletContext中。但是我在使用的时候发现,用户主动退出系统(退出函数中销毁session),在线用户数不会改变,只有等session超时自动过期在线用户数才会减少。跟踪代码发现,用户主动退出系统,session销毁,但是用户主动退出系统后重定向到登录页面,session会再次建立(在线用户数-1又+1=不变)。意思就是说只要到了登录页面,不管有没有登录成功,都会建立一个session。难道tomcat在应用被访问时就创建session么?再查资料以后发现,原来tomcat并不是应用被访问就创建session,竟然也不是在动态存放内容到session中时创建,而是在调用getSession()方法时,如果session存在就访问存在的session,如果不存在就创建session并返回刚创建的session。查了代码看到项目中在登录页面时有调用getSession()做一些逻辑,所以只要进入登录页面,即便用户还没有登录,session也被创建出来了,只是还未放入用户信息等参数而已。
结论:如果能够确保session销毁后不会再使用getSession()做逻辑,那么可以使用HttpSessionListener来统计在线用户数,否则,在线人数+1的逻辑不能在监听到session创建事件时就做&#x