tomcat session 持久化

mcat6 中关闭服务 会自动把session持久化
存储在work目录下的 一个session.ser
对于Session的管理,tomcat两个实现类:org.apache.catalina.session.StandardManager和org.apache.catalina.session.PersistentManager
StandardManager  默认的方法 可以配置的地方比较少
PersistentManager  提供了很灵活的管理方式 配置性强

网上实现配置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" />

关于节点的说明如下图:


className:Session的管理类,tomcat将会通过定义的接口来应用该类生成的对象。
debug:Session管理器的跟踪级别。
saveOnRestart:(true/false)配置服务重启工程中对session的处理,若为true,则关闭前把有效的session保存,启动后重新载入
maxActiveSession:活动状态Session的最大数,为-1时则不限制,否则Session Manager将会把超出的Session对象转移到Session Store中。
minIdleSwap:Session不活动的最短时间,超过该时间,Session Manager 可能会把该Session对象转移到Session Store中,单位为秒。
maxidleSwap:Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象转移到Session Store中,该Session将不在内存中。
maxidleBackup: Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象备份到Session Store中,但该Session对象依然存在内存中。
<Store>指定实现持久化的类和Session存放的文件位置,如该例子中指定的类是:org.apache.catalina.session.FileStore,而Session对象存放的目录则是tomcat根目录下的 session文件夹(当然自己创建)


记下在复制session中遇到的一个异常:
IOException while loading persisted sessions: java.io.WriteAbortedException
原来要让session存储的类没有序列化 引起io异常 在类后面实现Serializable 接口 (implements   java.io.Serializable  )

为什么要序列化呢 序列化:java.io.Serializable
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.
原因就在这里 序列化是将对象转换为容易传输的格式的过程 所以session序列化才能更好的传输和存储
不只是session 要存储一个对象 保存成文件 都需要序列化。

以前认为序列化

用处不大 所以尽量不用 结果问题就找过来了  做程序还是得严谨啊





Session的使用

Session是一种用来跟踪用户状态的机制,那它是怎么实现的呢?Servlet容器通过在客户端浏览器中保存一个Session ID来跟踪Session,调用session.getID()可以看到你的Session ID是多少。如果客户端支持Cookie,就把Session ID作为Cookie保持在浏览器中,现在绝大多数浏览器都会把Cookie功能打开,但如果用户禁止了Cookie呢?Java Servlet API中提出了另外一种机制,Servlet容器可以重写客户requst的URL,把Session ID添加到URL信息中,HttpServletResponse接口提供了这样的方法:public StringencodeURL(String url)-先判断如果没有启用Session,例如jsp中<%@ pagesession="false"%>或执行了session.invalideate(),那么直接返回url,在判断客户端师父支持 Cookie,如果不支持,就在url中加入c ID的信息,然后返回修改后的url。

Session的管理

当一个sesson开始时,Servlet容器会创建一个HttpSession对象,在某些情况下把这些Httpsession对象 从内存中转移到文件系统中或数据库中,需要访问的时候在把它们载入到内存中来。这样做的好处有两点:节约了内存的消耗,当web服务器产生故障时,还可以 从文件系统或数据库中恢复Session的数据。

Session 的持久化是由 Session Manager 来管理的。 Tomcat 提供了两个实现类

l        org.apache.catalina.session.StandardManager;

l        org.apache.catalina.session.PersistentManager。

StandardManager

Standard Manager 是默认的 Session Manager. 它的实现机制为:当 Tomcat 服务器关闭或重启,或者 web 应用被重新加载时,会对在内存中的 HttpSession 对象进行持久化,把它们保存到文件系统中,默认的文件为:<CATALINA_HOME>/work/Catalina/hostname/applicationname/SESSIONS.ser

 PersistentManager

PersistentManager 能够把 Session 对象保存到 Session Store 中,它提供了比 StandardManager 更为灵活的 Session 管理功能,它具有以下功能:

1.       对内存中的 HttpSession 对象进行持久化,把它们保存到 Session Store 中;

2.       具有容错功能,及时把 Session 备份到 Session Store 中,当 Tomcat 服务器意外关闭后再重启时,可以从 Session Store 中恢复 Session 对象;

3.       可以灵活控制在内存中的Session数目,将部分Session转移到Session Store中。

Tomcat 实现持久Session Store的接口为org.apache.Catalina.store,目前提供了两个实现这一接口的类:org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore.

如何配置PersistentManager以及两种持久化Session Store

l        配置 FileStore:

FileStore 将 HttpSession 对象保存在一个文件中。这个文件的默认目录为

<CATALINA_HOME>/work/Catalina/hostname/applicationname.每个 HttpSession 对象都会对应一个文件,它以 Session 的 ID 作为文件名,扩展名为: .session。

 

例:为 helloapp 应用配置 FileStore

Server.xml

<!-- configureFileStore -->

<Contextpath="/helloapp" docBase="helloapp" debug="0"reloadable="true">  

<ManagerclassName="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>

l        配置 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 char(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

<!-- configureJDBCStore -->

<Context path="/helloapp" docBase="helloapp"debug="0" reloadable="true">

<ManagerclassName="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>

 

在web.xml文件中,位于<servlet-mapping>和<welcome-file-list>元素之间加入如下代码,单位为分钟:

<session-config>   
    <session-timeout>60</session-timeout>
</session-config>

 

一点说明:

1.        也可以打开context.xml,在<Context>节点下添加如下<Manager>节点,在这里配置Session持久化,配置后将对所有的站点生效;

2.        className:Session的管理类,tomcat将会通过定义的接口来应用该类生成的对象;

3.        debug:Session管理器的跟踪级别;

4.        saveOnRestart:(true/false)配置服务重启工程中对session的处理,若为true,则关闭前把有效的session保存,启动后重新载入;

5.        maxActiveSession:活动状态Session的最大数,为-1时则不限制,否则Session Manager将会把超出的Session对象转移到Session Store中(-1表示没有限制);

6.        minIdleSwap:Session不活动的最短时间,超过该时间,SessionManager 可能会把该Session对象转移到Session Store中,单位为秒(-1表示没有限制);

7.        maxidleSwap:Session不活动的最长时间,超过该时间,SessionManager 将会把该Session对象转移到Session Store中,该Session将不在内存中(-1表示没有限制);

8.        maxidleBackup: Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象备份到Session Store中,但该Session对象依然存在内存中(-1表示没有限制);

9.        <Store>指定实现持久化的类和Session存放的文件位置;

10.    如果session中存储了类xzy登录属性的实例,则类xzy登录属性必须能够序列化,才能实现session持久化。

 

 

Tomcat的admin平台和manager平台

这是Tomcat中自带的两个Web应用,位于<%CATALINA_HOME%>/server/webapps /admin(manager),访问地址是http://localhsot:8080/admin(manager)。要访问这两个Web应用,需要 在
<%CATALINA_HOME%>/conf/tomcat-users.xml中添加如下内容:
<user username="admin" password="1234"role="admin"/>          //对应admin Web应用
<user username="manager" password="1234"role="manager"/>   //对应manager Web应用

admin平台把所有可配置的信息分为三类:Tomcat Server、Resources、User Definition。
Tomcat Server-相当于server.xml中的<Server>元素及其子元 素,<Service>、<Host>、<Context>、<Resources>、<Date Source>。
Resources-相当于server.xml中的<GlobalNamingResources>,共有四种资源:Date Source(JNDI数据源)、Mail Sessioin(JNDI Mail Session资源)、Environment Entry(环境变量)、User Database(安全域中的用户数据库)。
User Definition-与tomcat-users.xml相对应。

manager平台-列出来所有Web应用和状态,并提供了Start、Stop、Reload、 Undeploy命令,还可以发布
<%CATALINA_HOME%>/webapps目录下的Web应用或系统文件任意位置的WAR文件。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值