当一个Session开始时,Servlet容器会为Session创建一个HttpSession对象。Servlet容器在某些情况下把这些 HttpSession对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession信息时再把它们加载到内存中。
实现:
要完成session持久化,存放在session里的对象必须要实现java.io.Serializable 接口。
Session的持久化是由Session Manager来管理的。Tomcat提供了两个实现类:
org.apache.catalina.session.StandardManager (默认)
org.apache.catalina.session.PersistentManager
下面分别就StandardManager和PersistentManager两种实现进行介绍。
配置:
Tomcat默认是已经启用持久化配置,若要禁用持久化功能,则只需要在<Context>节点里配置
<Manager pathname="" />;
持久化配置可进行全局配置和针对某一站点进行配置。全局配置需要在cof文件夹context.xml的
<Context>节点中配置<Manager>,若要针对某一站点配置则需要在cof文件夹server.xml的<Host><Context>
节点中添加<Manager>配置。
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>节点:
<Manager className="org.apache.catalina.session.PersistentManager"
debug="0"
saveOnRestart="false"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1">
<Store className="org.apache.catalina.session.FileStore" directory="../session" />
</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、
严重: storing attribute '/test/ip/testAction!send.action' with value NOT_SERIALIZED
也就是说程序在运行的时候会把访问路径放到session中,但这个数据是没有序列化过的,导致反序列化的时候出错。
在关闭和重启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资源了.
你也可以在server.xml中指定上面的值. 这也所有的程序都使用这个设置了.