一、UML图分析:

(一) Session:

Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认是60秒,如果超过60秒该客户端没有再发送请求信息过来,则服务器会删除该session;

1、每个session有一个唯一的id用来区分不同的session;

2、从session的构造函数可以看出session必须关联一个manager对象,manager是session管理器;

3、MaxInactiveInterval是session在无访问时最大生存时间,默认60秒,可以通过setMaxInactiveInterval来设置这个值,判断session是否失效时是拿当前时间和LastAccessTime来比较,每当访问一个session时会调用其access方法来更新LastAccessTime值;

4、Attributes属性保存了session相关属性值,这个属性是一个hashmap类型的,可以通过名称快速查找到对应的属性;

5、当session失效时会调用invalidate将session进行失效,invalidate会调用expire来将session失效;

6、当servlet程序员调用Request.getSession时,返回的是StandardSession的门面对象StandardSessionFacade,所有的访问都是转给StandardSession对象的,保证了servlet程序员能安全的访问session对象;在Request.getSession中可以看到要获取到对应的session时,先从context中获取manager对象,然后从manager中查找指定id的session,如果查找不到则调用createSession创建新的session对象;

(二) Manager:

Manager作为session管理器,session既可以存储在内存中,也可以存储到存储设备中,StandardManager将session存储在内存中,PersistentManagerBase作为将session存储在存储设备的基类,子类DistributedManager实现session的集群管理;

1、      manager通过getContainer和setContainer将manager与context容器相关联;

2、      sessions变量是一个hashMap类型的,存储了所有的session,createSession创建一个新的session并添加到这个hashMap中,add添加session,remove删除session,findSession查找指定id的session;

3、      unload将sessions变量中的session保存到磁盘上,load将磁盘上的session文件加载到内存中;

4、      StandardManager的stop方法会调用unload方法将有效的session保存到SESSION.ser的文件中,每个Context容器都会产生这样一个文件,这个文件位于CATALINA_HOME指定目录下的work目录中;

5、      processExpires方法会销毁管理器中那些已经失效的session,失效时间值可以通过设置maxInactiveInterval的值来设置,该值默认为60秒;但是在setContainer中关联manager与Context时,会将该值改为Context.SessionTimeOut值,这个值默认为30分钟;

6、      maxActiveSessions变量设置了允许的最大活动session的数量,一旦超过这个值时,就不允许再创建新的session;

7、      PersistentManagerBase类实现了session的换出和备份:当活动session数量超过MaxActiveSessions时(processMaxActiveSwaps),或者session闲置时间超过maxIdleSwap时(processMaxIdleSwaps),就需要将session换出到存储设备;当session闲置时间超过maxIdleBackup时,会将该session备份到存储设备(processMaxIdleBackups);

(三) Store(存储器):

存储器store是用于将session持久化的组件;

1、Store接口中的load和save方法分别用于将session从磁盘加载到内存对象和将内存中的session存储到磁盘上,但是这两个方法在storeBase中均没有实现,而是在其子类FileStore和JDBCStore中实现;

2、storeBase中的processExpires方法从所有活动的session中移除过期的session;

3、fileStore会将每个session单独存储为一个文件,文件名为“sessionId.session”,位于临时的工作目录下,也可以调用FileStore.setDirectory方法修改临时目录的位置;

4、JDBCStore的load和save方法分别用于将session从数据库加载和将session保存到数据库中,因此需要设置其setDriverName和setConnectionURL来设置数据库连接信息,操作的表名存储在sessionTable中,操作的字段有:sessionIdCol、sessionDataCol、sessionValidCol、sessionMaxInactiveCol、sessionLastAccessedCol,这几个字段都有默认值,可以通过对应的set方法来修改;

二、集群管理:

DistributedManager实现了session的集群管理,其集群管理是通过ClusterSender和ClusterReceiver来实现的,ClusterSender用于将session广播到集群中的其他节点,ClusterReceiver用于接受到其他节点广播过来的session时,将流还原成内存中的session对象;

1、createSession时,首先创建一个session对象,然后将其序列化为流对象,最后使用ClusterSender将其广播到其他节点,代码如图:

2、DistributedManager本身也是一个线程对象,在线程中定时执行processClusterReceiver,这个方法将接收到的流转换为内存session对象并添加到manager中;代码如图:

tomcat源码阅读之session管理器(Manager)的更多相关文章

  1. SpringMVC源码阅读:核心分发器DispatcherServlet

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将介绍SpringMVC的核 ...

  2. TOMCAT源码分析——生命周期管理

    前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...

  3. SpringMVC源码阅读:视图解析器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  4. SpringMVC源码阅读:异常解析器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  5. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  6. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  7. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  8. tomcat源码阅读之安全机制

    一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...

  9. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

随机推荐

  1. 使用Python生成双色球号码

    说来也是巧,今天和一个朋友聊天,说他运气不错应该买彩票,于是就想到了双色球的规则,就写了几行代码产生双色球号码,代码如下: import random,time def process_int(x): ...

  2. ubuntu vim简单命令

    1.ubuntu  vim 一些基本的命令. :set nu  或着 set number   设置行数 :set nonu          取消行数 ctrl+u                将 ...

  3. vij 1097 贪心

    合并果子 描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之 ...

  4. 破解VS

  5. spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志

    spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...

  6. CCF 2015-03-3 节日

    输出y1到y2年之间的每一年的a月份的第b个周c.感觉像是一个恶心的模拟.更像一个很恶心的小学奥赛题. 题目:http://115.28.138.223/view.page?gpid=T25 考试的时 ...

  7. linux create a process

    When the system starts up it is running in kernel mode and there is, in a sense, only one process, t ...

  8. 快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告

    Treasure of the Chimp Island Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  9. Scrapy-redis实现分布式爬取的过程与原理

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求 ...

  10. [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序

    [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序   一.练习项目: http://www.asp.net/mvc/tutorials/mvc-4/gettin ...