当一个 Session 开始时, Servlet 容器会为 Session 创建一个 HttpSession 对象。 Servlet 容器在某些情况下把这些HttpSession 对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession 信息时再把它们加载到内存中。 Session 的持久化是由 Session Manager 来管理的。 Tomcat 提供了两个实现类 org.apache.catalina.session.StandardManager org.apache.catalina.session.PersistentManager 1.StandardManager Standard Manager 是默认的 Session Manager. 它的实现机制为:当 Tomcat 服务器关闭或重启,或者 web 应用被重新加载时,会对在内存中的 HttpSession 对象进行持久化,把它们保存到文件系统中,默认的文件为: <CATALINA_HOME>/work/Catalina/hostname/applicationname/SESSIONS.ser 2.PersistentManager PersistentManager 能够把 Session 对象保存到 Session Stor 中,它提供了比 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 以及两种持久化 Session Store. 配置 FileStore FileStore 将 HttpSession 对象保存在一个文件中。这个文件的默认目录为 <CATALINA_HOME>/work/Catalina/hostname/applicationname. 每个 HttpSession 对象都会对应一个文件,它以 Session 的 ID 作为文件名,扩展名为: .session. 例:为 helloapp 应用配置 FileStore Server.xml <!-- configure FileStore --> <Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true"> <Manager className="org.apache.catalina.session.PersistentManager" > debug=0; saveOnRestart="true" maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="mydir" /> </Manager> </Context> 配置 JDBCStore JDBCStore 将 HttpSession 对象保存在数据为库的一张表中。 例: MySQL 中创建 Session 表的步骤,假定表的名字为 tomcat_sessions, 这张表所在的数据库为tomcatsessionDB. CREATE DATABASE tomcatsessionDB; Use tomcatsessionDB Create table tomcat_session( session_id varchar(100) not null primary key, valid_session chart(1)not null, max_inactive int not null, last_access bigint not null, app_name varchar (255), session_data mediumblob, KEY kapp_name(app_name) }; Server.xml <!-- configure JDBCStore --> <Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true"> <Manager className="org.apache.catalina.session.PersistentManager" > debug=99; saveOnRestart="true" maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.JDBCStore" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/tomcatsessionDB?user=dbuser;password=1234" sessionTable="tomcat_sessions" sessionIdCol="session_id" sessionDataCol="session_data" sessionValidCol="valid_session" sessionMaxInactiveCol="max_inactive" sessionLastAccessedCol="last_access" sessionAppCol="app_name" checkInterval="60" debug="99" /> </Manager> </Context>
Servlet Session的持久化
最新推荐文章于 2025-12-19 15:28:51 发布
本文介绍了Tomcat中Session的持久化机制,包括StandardManager和PersistentManager两种方式,并详细讲解了如何配置FileStore和JDBCStore进行Session存储。
591

被折叠的 条评论
为什么被折叠?



