session 持久化问题(重启服务器session 仍然存在)
来源:互联网 发布:vb窗体透明控件不透明 编辑:程序博客网 时间:2024/06/05 10:24
转:http://xiaolongfeixiang.iteye.com/blog/560800
关于在线人数统计,大都使用SessionListener监听器实现。
SessionListener 触发源:
1、Session Create 时
2、Session timeout 时
3、显式调用session的invalidate方法 时
4、在Tomcat设置Session持久化为FALSE的情况下,Tomcat关闭时,触发Session destroy事件
5、在Tomcat设置Session持久化为TRUE的情况下,Tomcat重启后,检测到Session超时时,触发Session destroy事件(可归入第2中情况中)
如何Tomcat Session持久化配置?
在默认的情况下,Tomcat6是提供了这项功能的。请查看$TOMCAT_HOME$/conf/context.xml。在大概24行,你会看到注释:
- <!-- Uncomment this to disable session persistence across Tomcat restarts -->
- <!--
- <Manager pathname="" />
- -->
这说明默认的Tomcat是支持Session持久化的。当然,取消注释也就取消了这个功能。
Session持久化&不持久化
如果Tomcat配置为Session的不持久化,在Tomcat关闭时,会自动触发Session destroy事件。
如果Tomcat配置为Session的持久化,在Tomcat关闭时,不会触发Session destroy事件。而是将每个Session中内容写入到文件中。当Tomcat再次启动时,会读取该参数,并且验证Session是否TimeOut(但是这个验证似乎有点延迟,大概几秒钟吧。如果检测到超时,则Tomcat会自动触发Session Destroy事件)。
失败案例分析:
最近在分析一个其他人写的应用中,发现在线人数出现负数的情况。原因是没有修改Tomcat的默认配置,因此Session的持久化功能是开启的。当Tomcat重启后,由于在线人数是Listener中的Static常量,所以重启后会归零。重启后,如果触发了Session Destroy事件,那么就会出现在线人数为负的情况。
但是,重启后用户的什么操作会触发Session Destroy事件呢?
首先,1个大前提是用户的浏览器在Tomcat重启的间隔都一直存在,且未进行其他操作。(很简单,如果在重启期间,进行任何操作的话,肯定会看到“服务器无法响应”的错误信息,自然就离开了。也就不会有以后了。。)
然后,分2种情况:
情形1: 如果Tomcat关闭的时间大于Session的超时时间。Tomcat会自动地触发Session Destroy事件。上面已经说了,这个“自动”是有延迟的。如果用户进行任何操作,都会立即触发Session Destroy事件。
情形2:如果Tomcat的关闭时间小于Session的超时时间,那么用户点击“注销”等类似的注销功能、或者Session超时,就会触发Session Destroy事件。
解决的办法:
方案1:关闭Tomcat Session 持久化的功能。取消那句注释即可。
方案2:将在线人数存放在数据库中,每次改变在线人数,都要访问数据库。(加重了数据库访问量)
- session 持久化问题(重启服务器session 仍然存在)
- session 持久化问题(重启服务器session 仍然存在)
- session 持久化问题
- 服务器session持久化 SESSION.ser文件
- Tomcat服务器session持久化
- Tomcat服务器session持久化
- Tomcat服务器session持久化
- Session持久化问题[转]
- 15.重启tomcat,session仍存在
- WebApp服务器 禁用/启用 SESSION持久化
- Session持久化
- Session持久化
- Session持久化
- Session持久化方法
- Session持久化
- Session持久化
- tomcat session 持久化
- session 的持久化
- [Linux笔记]Linux内核的Makefile和kconfig解读
- Netty 3.1 中文用户手册(三)-架构总览
- 金蝶EAS BOS开发之扩展表应用
- c++ 大整数类CCBigInteger 加减法功能的实现
- Sql Server 2008 出现"provider:命名管道提供程序,error:40"问题,无法登录数据库
- session 持久化问题(重启服务器session 仍然存在)
- Android Context
- 因C#一段代码,引发的问题
- java RSA 加解密
- 动态链接库的静态链接导致程序的DLL劫持漏洞
- android_应用开发之(优化布局层次结构)
- 打开网络驱动器上的chm文件
- mongodb删除集合后磁盘空间不释放
- js自定义消息机制研究学习