[转]session 持久化问题(重启服务器session 仍然存在)

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

Xml代码  

  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:将在线人数存放在数据库中,每次改变在线人数,都要访问数据库。(加重了数据库访问量)

时间: 2024-10-10 00:09:53

[转]session 持久化问题(重启服务器session 仍然存在)的相关文章

Tomcat Session 持久化

Session的主要数据被存储在服务器内存中,而服务器会为每个在线用户创建一个Session对象,当在线用户很多时,例如同时有几万或是几十万在线的情况下,Session内存的开销将会十分巨大,会影响Web服务器性能.而Session的钝化机制刚好可解决此问题.Session钝化机制的本质就在于把服务器中不经常使用的Session对象暂时序列化到系统文件系统或是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成. 实现: 要完成session持久化,存放在session里的对象必须

Session持久化

1.客户端访问Web服务器资源,服务器就会创建一个对该客户相对应的HttpSession对象.即使客户已经离开了浏览器,服务器仍要保留与之对应的HttpSession对象,直至超时. 2.服务器通常把那些暂时不活动但未超时的HttpSession对象转移到文件或数据库中,要使用它们的时候在从中取出装入内存. 这种技术叫做Session持久化 3.持久化的作用: 提高服务器内存的利用率,保证那些暂停活动的客户端在会话超时之前继续原来的会话 在多台web服务器协同对外提供服务的集群系统中,使用Ses

PHP将session保存到memcache服务器

传统的 session 是写入到服务器文件中,可以在 php.ini 中看出,清单如下 [plain] view plaincopy session.save_handler = files session.save_path = "sess保存路径" 但是,如果网站用户很多的话,session 的访问将势必影响网站的速度.因为文件的读取速度是很低的. 众所周知,memcache 作为内存缓存服务器,通过哈希算法,把数据以key->value的形式进行读取,其速度是远远高于文件的

tomcat配置session持久化

Session的管理,tomcat两个实现类:org.apache.catalina.session.StandardManager和org.apache.catalina.session.PersistentManager StandardManager 默认的方法 可以配置的地方比较少 PersistentManager 提供了很灵活的管理方式 配置性强 形式一:存储在本地文件中:配置conf目录里的context.xml文件 1.修改的文件: $Tomcat_HOME/conf/conte

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

tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomcat的context.xml配置文件,去掉 <Manager pathname="" /> 和 <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />

http服务器--session处理

http服务器--session处理 1. 概述 Session处理是一般带有会话功能服务器必须处理的功能.使用session记录一个会话,能够有效处理短连接或者断线重连的需求.session是存放在服务器的内容,具有如下特性: A. 时间性,创建的session如果长时间没有响应,则服务器需要删除该session,以防止session的无限增长. B. 唯一性,在同一个服务器上,sessionId不能重复,如果重复就会出现歧义. C. 全局性,对于是否为同一会话,服务器上只认sessionId

集群服务器Session同步及一种基于Memcached的session同步

1 Session的集群管理 事实上,网站总是有状态的.每一个登录信息.用户信息常常被存储在session内部.而当一个网站被部署在不止一台服务器的时候,就会遇到session同步的问题.事实上即使一个很小的网站,也要至少有两台服务器互为备份,分单流量是必须得,更重要的是无缝切流量升级.为了保证服务的不间断又要进行网站的维护升级,切流量是最简单的.那么如何保证切流量的时候session也会跟着同步过去呢?在集群环境下,大致有以下几种手段 1.1 Session复制 这是一种在早期应用系统中使用较

用redis实现跨服务器session(转)

这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡, 上面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两个redis值主从结构. 因此需要使用跨服务器的session保存用户登录状态,于是我写了一个跨站的session共享的类 点击(此处)折叠或打开 <?php /* *用redis实现跨服务器session *注意需要安装phpredis模块 * *作者:yifangyou *日期:2012-07-

服务器session,Tomcat有自己的session维护机制,apache有自己的session维护机制

1.SESSION一般不是你说的这种工作方式,你打开一个浏览器,再打开一个,请求同一个网址,然后其中一个登陆,另外一个绝对不会也登陆.SESSION和浏览器本身这个程序就是挂钩的,一般不通过IP和端口去绑定(如果是端口和IP的话,浏览器关闭了SESSION也不一定会失效,显然有安全问题,这个是因为TCP协议的一些问题,很容易被利用到). 当浏览器和服务器联系的时候,服务器会发一个SESSIONID给浏览器,然后浏览器记录这个SESSIONID,每次访问的时候将ID附带过去.假如你想浏览器关闭后重