学习tomcat 小记(4)

[size=large]session管理[/size]
[size=medium]
1)Session
catalina通过一个成为manager的组件管理session,该组件要实现org.apache.catalina.Manager接口,且必须与一个context关联。相比于其他组件,manager负责创建、更新、销毁session对象。

Session接口
Session接口是作为catalina的外观类使用的。Session对象的标准实现StandardSession类也实现了javax.servlet.http.HttpSession接口。
session对象总是存在于manager组件中,getManager/setManager方法用于设置session和manager的关联。对某个session实例来说,在与其关联的manager内,该session有唯一标识,该标识可通过setId/getId方法来访问。manager调用getLastAccessedTime方法来决定某个session对象的有效性。manager调用setValid方法将某个session对象标识为有效。每次访问session对象时,它的调用方法都会修改该session对象的最后访问时间。最后,manager可以通过调用expire方法将某个session对象标识为过期,也可以通过getSession方法获取一个经过session外观类包装过的HttpSession对象。

StandardSession类
StandardSession是catalina中Session接口的标准实现。除了实现javax.servlet.http.HttpSession接口和org.apache.catalina.Session接口外,StandardSession类还实现了java.lang.Serializable接口。

StandardSessionFacade类
为了传递一个session对象给servlet,catalina会实例化一个Session对象,填充session对象内容,然后再传给servlet。但是,实际上,catalina传递的是session的外观类StandardSessionFacade的实例,该类仅仅实现了javax.servlet.http.HttpSession接口。


2) Manager
manager组件负责管理session对象,例如创建和销毁session对象。catalina中manager组件必须要实现org.apache.catalina.Manager接口。org.apache.catalina.session包内的ManagerBase是Manager接口的基本实现,它有两个直接子类:StandardManager类和PersistentManagerBase类。
当运行tomcat时,StandardManager实例负责在内存中管理session,但当服务器关闭时,会将当前内存中的session写入到文件中,等服务器再次启动时,会重新载入这些session。

Manager接口
Manager接口通过getContainer/setContainer来与某个container相关联。使用createSession方法来创建一个session对象。使用add方法将某个session对象添加到session池中,或使用remove方法将某个session删除。getMaxInactiveInterval/setMaxInactiveInterval来访问/设置maxInactiveInterval变量,单位为秒。
使用unload方法可以将session对象持久化到二级存储设备中,load方法则可以将其载入到内存中。

[color=blue]ManagerBase[/color]类是一个抽象类,实现了Manager接口。该类提供了一些基本的功能。

[color=blue]StandardManager[/color]类是Manager接口的标准实现,该类将session对存储与内存中。StandardManager类还是先了Lifecycle接口,可由其container负责启动/关闭。其中,stop方法会调用unload方法将session对象序列化到一个名为Session.ser的文件中,每个context一个文件。SESSIONS.ser文件位于CATALINA_HOME目录下的work目录中。当StandardManager再次启动时,会调用load方法从文件再次读取session对象到内存中。

当session无效时,manager组件要负责销毁session对象。在tomcat4中,StandardManager类使用另一个线程完成此任务。因此,StandardManager类还要实现java.lang.Runnable接口。
public void run() {
// Loop until the termination semaphore is set
while (!threadDone) {
threadSleep();
processExpires();
}
}

在tomcat5中,StandardManager类没有实现java.lang.Runnable接口,processExpires方法会直接被backgroundProcess方法调用,tomcat4中并不包含backgroundProcess方法:
public void backgroundProcess() {
processExpires();
}

[color=blue]PersistentManagerBase[/color]类是所有持久化manager的父类。StandardManager类和持久化manager的区别在于后者的存储方式(store)。store表示了管理session对的二级存储设备。

swap out(换出)
PersistentManagerBase类在换出session对象时要遵守一定的规则。只有当活动session的数量超过一定限制,或某个session已经过期时,才能将其换出。

back up(备份)
不是所有的session都会备份,PersistentManagerBase类只会备份那些空闲时间超过maxIdleBackup的session。该任务由processMaxIdleBackups方法完成。


PersistentManager类
PersistentManager类继承自PersistentManagerBase类,并没有添加其他的方法,只是多了两个属性:
// The descriptive information about this implementation.
private static final String info = "PersistentManager/1.0";
// The descriptive name of this Manager implementation (for logging).
protected static String name = "PersistentManager";

DistributedManager类
tomcat4中提供了DistributedManager类,该类继承自PersistentManagerBase类。该类用于两个或多于两个节点的集群环境。一个节点表示了一个tomcat的部署。集群中的节点可以在同一台物理机器,也可以在不同的物理机器。在集群环境中,每个节点必须使用DistributedManager实例作为其manager,才能支持session的复制,这也是DistributedManager类的主要功能。

Stores
store由org.apache.catalina.Store接口表示。manager组件使用store作为持久化session的存储设备。
其中save和load是两个比较重要的方法。save方法将指定的session对象持久化到store中。load方法则根据参数id从store中找到对象的session,载入到内存中。

[color=blue]FileStore[/color]类将session对象持久化到某个文件中。文件名的格式为“sessionid+‘.session’”。文件位于临时的工作目录下,可以调用FileStore类的setDirectory方法修改临时目录的位置。

[color=blue]JDBCStore[/color]类将session对象通过jdbc存入数据库中。因此,为了使用JDBCStore,你需要调用setDriverName方法和setConnectionURL方法来设置数据库驱动和连接url。

3)加入SessionManager的系统结构:
使用默认的connector,使用一个context作为容器,容器中有一个wrapper。区别一,context中有一个StandardManager类的实例,用于管理session对象。

Bootstrap类
Bootstrap类会创建一个org.apache.catalina.session.StandardManager类的实例,并将之与Context相关联。

SimpleWrapperValve类
当servlet调用javax.servlet.http.HttpServletRequest接口的getSession方法获取session实例。当调用getSession方法时,request对象必须访问与context相关联的manager。manager组件要么创建一个新的session,要么返回一个已经存在的session。request对象为了能够访问manager,它必须能够访问context。为了达到此目的,在SimpleWrapperValve类的invoke方法中,可以调用org.apache.catalina.Request接口的setContext方法,传入Context实例。因此,必须在servlet的service方法调用前设置好context。

[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值