?
當一個 Session 開始時, Servlet 容器會為 Session 創建一個 HttpSession 對象。 Servlet 容器在某些情況下把這些 HttpSession 對象從內存中轉移到文件系統或數據庫中,在需要訪問 HttpSession 信息時再把它們加載到內存中。
Session 的持久化是由 Session Manager 來管理的。 Tomcat 提供了兩個實現類
l???????? org.apache.catalina.session.StandardManager
l???????? 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 管理功能,它具有以下功能:
l???????? 對內存中的 HttpSession 對象進行持久化,把它們保存到 Session Store 中
l???????? 具有容錯功能,及時把 Session 備份到 Session Store 中,當 Tomcat 服務器意外關閉后再重啟時,可以從 Session Store 中恢復 Session 對象。
l???????? 可以靈活控制在內存中的 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>