tomcat源码阅读之session管理器(Manager)
一、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)的更多相关文章
- SpringMVC源码阅读:核心分发器DispatcherServlet
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将介绍SpringMVC的核 ...
- TOMCAT源码分析——生命周期管理
前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...
- SpringMVC源码阅读:视图解析器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- SpringMVC源码阅读:异常解析器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
- tomcat源码阅读之安全机制
一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
随机推荐
- unittest参数化
我们在写case的时候,如果用例的操作是一样的,就是参数不同,比如说要测一个登陆的接口,要测正常登陆的.黑名单用户登陆的.账号密码错误的等等,在unittest里面就要写多个case来测试. 这样的情 ...
- UVA-1220 Party at Hali-Bula (树的最大独立集)
题目大意:数的最大独立集问题.特殊在要求回答答案是否唯一. 题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根 ...
- Leetcode 92
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- TABLE中动态设置poplist的值跟着当前行的某些列动态变化
核心方法 OAAdvancedTableBean table = (OAAdvancedTableBean)webBean.findChildRecursive("TimeEntryTbl& ...
- Google浏览器设置变更默认搜索引擎为百度
- OC 内存管理之手动内存管理MRC
一.基本原理 1.什么是内存管理 内存管理的重要性: 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. ...
- Spark任务提交底层原理
Driver的任务提交过程 1.Driver程序的代码运行到action操作,触发了SparkContext的runJob方法.2.SparkContext调用DAGScheduler的runJob函 ...
- 等待进程结束wait,waitpid
当子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵死状态. pid_t wait(int *status); pid_t waitpid(pid_t pid, ...
- 快速切题 sgu120. Archipelago 计算几何
120. Archipelago time limit per test: 0.25 sec. memory limit per test: 4096 KB Archipelago Ber-Islan ...
- LINUX文件格式化读写(文件指针,缓冲)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...