?
當一個
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
<!-- 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)
};
?
<!-- 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>
?