转: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行,你会看到注释:

  1. <!-- Uncomment this to disable session persistence across Tomcat restarts -->
  2. <!--
  3. <Manager pathname="" />
  4. -->

这说明默认的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 仍然存在)的更多相关文章

  1. Tomcat下 session 持久化问题(重启服务器session 仍然存在)

    感谢大佬:https://www.iteye.com/blog/xiaolongfeixiang-560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionLi ...

  2. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  3. [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)

    本文转自:https://blog.csdn.net/wellway/article/details/76176760 在之前的这篇文章 在ExpressJS(NodeJS)中设置二级域名跨域共享Co ...

  4. java 中Session 持久化问题

    首先: 今天发现了个session 持久化的问题 在Tomcat 停止运行后再启动  session  中保存的东西还会存在 ,百度了一下 原理 1.Session Create 时 2.Sessio ...

  5. Asp.Net进程外Session(状态服务器Session、数据库Session)

    介绍 我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了.即Seesion就丢失了.(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变 ...

  6. Tomcat 之session 持久化2

    通过前文 Tomcat 之session 持久化1 ,我们已经大概了解了这么个机制.但是我没能详细展开其底层的原理. 这篇文章,我想稍微深入一点点,再继续聊一聊其底层. Tomcat 之session ...

  7. Tomcat 之session 持久化1

    Tomcat 之session 持久化原理 几个概念: Manager 接口,其实就是指的是对  其Sesison 的管理, 其默认实现是StandardManager (内部没有任何Store对象实 ...

  8. tomcat重启后session没有清除的解决办法

    tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomc ...

  9. node模拟http服务器session机制-我们到底能走多远系列(36)

    我们到底能走多远系列(36) 扯淡: 年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵.请珍惜! 主题:      我们在编写http请求处理和响应的代码的时 ...

随机推荐

  1. 《Remus: High Availability via Asychronous Virtual Machine Replication》翻译

    Abstract 想要让应用能够躲过硬件故障是一项非常昂贵的任务,因为这通常意味着对软件进行重构,使它包含复杂的恢复逻辑的同时需要部署专用的硬件,而这些对于提升大型的或者遗留的应用的可靠性是巨大的障碍 ...

  2. windows 10 & Office 2016 安装

    Office 2016 VOL版    http://blog.sina.com.cn/s/blog_470614a90102vtmc.html 专业版合集: magnet:?xt=urn:btih: ...

  3. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

  4. 能跨域和跨浏览器的flashcookie for jquery插件

    对于写网站时需要跨域和跨浏览器的可以看看这个. 引入jquery  和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯. mySwfStore.set('myKey ...

  5. linux下内网端口转发工具:linux版lcx [实现远程内网维护]

    这个工具以前使用的初衷是内网渗透,需要将内网ssh端口转发到外网服务器上.但这个工具同样适用于运维工程师进行远程内网维护. 当然这一切的前提是内网可以访问外网,检测方法当然就是直接ping 一个外网I ...

  6. ie9及以下不兼容event.target.dataset对象

    ie9及以下不兼容event.target.dataset对象,请使用event.target.getAttribute('data-xxx')

  7. HTML 学习笔记 CSS样式(背景)

    背景色 可以使用background-color属性为元素设置背景色 这个属性接受任何合法的颜色值. 可以使用background-image属性来喂元素设置背景图片. 背景重复 如果需要在页面上对背 ...

  8. JavaScript String 对象

    JavaScript String 对象 String 对象 String 对象用于处理文本(字符串). String 对象创建方法: new String(). 语法 var txt = new S ...

  9. linux运维中的命令梳理(三)

    ----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特 ...

  10. javascript中使用循环链表实现约瑟夫环问题

    1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...