设为首页 收藏本站
查看: 413|回复: 0

[经验分享] 学习tomcat 小记(4)

[复制链接]

尚未签到

发表于 2017-1-26 09:09:01 | 显示全部楼层 |阅读模式
session管理

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方法则可以将其载入到内存中。

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

StandardManager类是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();
}

PersistentManagerBase类是所有持久化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,载入到内存中。

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

JDBCStore类将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。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333526-1-1.html 上篇帖子: Tomcat 的 Valve 详解 下篇帖子: 浅析Tomcat之StandardContext
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表