对于一个企业级应用而言,session对象的管理十分重要。sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载时候,此时的session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的session数据存放在文件系统或数据库中,这样的操作称为session对象的持久化。session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在session中的数据需要实现可序列化接口(java.io.serializable)的原因了。
当一个Session开始时,Servlet容器会为Session创建一个HttpSession对象。Servlet容器在某些情况下把这些HttpSession对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession信息时再把它们加载到内存中。
Session的持久化是由Session Manager来管理的。Tomcat提供了两个实现类:
org.apache.catalina.session.standardmanager
org.apache.catalina.session.PersistentManager
下面分别就StandardManager和PersistentManager两种实现进行介绍。
1.StandardManager
StandardManager是默认的Session Manager。它的实现机制为:当Tomcat服务器关闭或重启,或者Web应用被重新加载时,会对在内存中的HttpSession对象进行持久化,并把它们保存到文件系统中,默认的文件为<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser。
2.PersistentManager
PersistentManager能够把Session对象保存到Session Store中,它提供了比 StandardManager更为灵活的Session管理功能,它具有以下功能:
对内存中的HttpSession对象进行持久化,把它们保存到Session Store中。
具有容错功能,可以及时把Session备份到Session Store中,当Tomcat服务器意外关闭后再重启时,可以从Session Store中恢复Session对象。
可以灵活控制在内存中的Session数目,将部分Session转移到Session Store中。
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="true"
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"
connectionURL="jdbc:mysql://localhost/session?usename=xxx&password=xxx"
sessionTable="session" sessionIdCol="session_id" sessionDataCol="session_data"
sessionValidCol="sessionValid" sessionMaxInactiveCol="maxInactive"
sessionLastAccessedCol="lastAccess" sessionAppCol="appName" checkInterval="60" debug="99" />