要完成session持久化,存放在session里的对象必须要实现java.io.Serializable 接口。
Session的持久化是由Session Manager来管理的。
Tomcat提供了两个实现类:
org.apache.catalina.session.StandardManager (默认)
org.apache.catalina.session.PersistentManager
1.StandardManager
StandardManager是默认的Session Manager。它的实现机制为:当Tomcat服务器关闭或重启,或者Web应用被重新加载时,会对在内存中的HttpSession对象进行持久化, 并把它们保存到文件系统中,默认的文件为<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser。
<Manager
className=”org.apache.catalina.session.StandardManager”
debug=”0”
maxInactiveInterval=”-1″
/>
注:如果突然终止该服务器,则所有会话都将丧失,因为StandardManager没有机会实现存盘处理。
2.PersistentManager
PersistentManager能够把Session对象保存到Session Store中,它提供了比 StandardManager更为灵活的Session管理功能,它具有以下功能:
对内存中的HttpSession对象进行持久化,把它们保存到Session Store中。
具有容错功能,可以及时把Session备份到Session Store中,当Tomcat服务器意外关闭后再重启时,可以从Session Store中恢复Session对象。
可以灵活控制在内存中的Session数目,将部分Session转移到Session Store中。
通过使用Store,将内存中的session备份到文件或数据库中。当备份一个session对象时,该session对象会被复制到存储器中,而原对象仍然留在内存中。因此如果服务器崩溃,就可以从存储器中获取活动的session对象。当session被换出时,他会被移动到存储器中,因为当前活动的session对象超过了上限值,或者session对象闲置了过长时间。换出session节省内存空间。
Tomcat实现持久化Session Store的接口为org.apache.Catalina.store,目前提供了两个实现这一接口的类,即 org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore。
实现配置PersistentManager大多是两种形式
形式一:存储在本地文件中需要配置conf目录里的context.xml文件
在<Context>节点下添加如下<Manager>节点:
|
形式二:存储在数据库中需要配置store节点
<Store calssName="org.apache.catalina.JDBCStore" driverName="com.mysql.jdbc.Driver" sessionIdCol="session_id" sessionDataCol="session_data" sessionMaxInactiveCol="max_inactive" sessionAppCol="app_name" checkInterval="60" debug="99" /> |
参数说明:
maxActiveSessions-可处于活动状态的session数,default -1 不限制
checkInterval -检查session是否过期的时间间隔,default 60s
saveOnRestart-服务器关闭时,是否将所有的session保存到文件中;
minIdleSwap/maxIdleSwap-session处于不活动状态最短/长时间(s),sesson对象转移到File Store中;(-1表示没有限制)
maxIdleBackup-超过这一时间,将session备份。(-1表示没有限制)
directory-文件存储位置work\Catalina\host name\web app\session\文件名.session
可能出现的问题:
1、
严重: Cannot serialize session attribute '/test/ip/testAction!send.action for session 1B2631B649053493F0C787FB62917E3A.tomcatA
严重: storing attribute '/test/ip/testAction!send.action' with value NOT_SERIALIZED
也就是说程序在运行的时候会把访问路径放到session中,但这个数据是没有序列化过的,导致反序列化的时候出错。
2、
启动的tomcat在启动的时候警告:
警告: Manager [ org.apache.catalina.session.PersistentManager@1cc5d23] does not implement ClusterManager, addition to cluster has been aborted.
在关闭和重启Tomcat 5时, tomcat 会试图 serialize存在的session资源. 如果 sessions中相关的对象没有实现 serializable 接口, 就会出现Cannot serialize session attribute XXX for 异常.
如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of just exploding the war) 的 <Context> tags中间 加上 :
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="false"/>
这样 tomcat 在关闭的时候就不会保存session资源了.