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中;代码如图:
转载于:https://www.cnblogs.com/laoxia/p/7831667.html
tomcat源码阅读之session管理器(Manager)相关推荐
- Tomcat源码分析(九)--Session管理
本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...
- 【Tomcat源码阅读】核心组件介绍(二)
Tomcat总体结构 Tomcat总体结构用下图来表示 图片摘自:https://blog.csdn.net/jiaomingliang/article/details/47393141 从上图可以看 ...
- (五)Tomcat源码阅读:Connector组件分析
一.概述 因为Connector组件没有实现接口规范,因此我们直接对该类的方法进行分析即可. 二.源码阅读 阅读思路,我的阅读思路是这样的,大的类无非就是对小类的使用,因此我们想分析整体的一下架构的化 ...
- mybatis源码分析之事务管理器
2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...
- Tomcat 源码阅读记录(1)
使用Ant 工具进行编译打包. 源码对应关系: SourceCode TargetPackage /bin /bin /conf /conf /java /lib/* /Modules 依赖包 /re ...
- Kafka源码阅读-Controller(二)管理brokers
上一篇kafka源码(一)correspond to/explain Kafka设计解析(二) 中的3.2.3.3.以前一直用kafka 0.8.2.x,那时候redis开始风靡,hadoop方兴未艾 ...
- postgres 源码解析9 CLOG管理器--1
1 背景介绍 在Postgres数据库的日志管理系统中,采用CLOG日志记录集群中每个事务的最终状态,在内存中形式是基于SLRU缓冲实现的,有兴趣的回顾下SLRU相关知识: 1 postgre ...
- postgres 源码解析25 缓冲池管理器-3
本文讲解缓冲块的选择策略BufferAlloc,同时该函数也是替换策略的核心函数, 知识回顾: postgres源码解析 缓冲池管理–1 postgres源码解析 缓冲池管理–2 总结<执行 ...
- Tomcat源码阅读---ServletContext.java(小白写作,持续更新)
everybody,想我没,刚考完操作系统,我胡汉三又回来啦!!!掌声!!!鲜花!!!接着奏乐,接着舞!!!来个大的!不要说我不够意思,这个ServletContext读完的确是让我对于web程序有了 ...
最新文章
- .NET平台BigO算法复杂度备忘
- 【python】【scrapy】使用方法概要(三)
- Apache Httpd常用命令
- Linux文件系统基础(1)
- Spring Boot基础学习笔记:可视化迎新
- CoinDesk将发布2018年比特币和区块链行业报告
- Halcon缺陷检测——测量拟合
- memcached教程_Memcached教程
- 【修正】Q93:PLY文件对应图形法向量反向问题——以bunny10K为例
- HTTP头部POST表单详解
- python使用webdriver处理上传文件(使用AutoIt)
- 读书-算法《程序设计导引及在线实践》-简单计算题2:棋盘上的距离
- 智能门锁的优劣,我们应该如何有效识别?
- smart3D的初探索
- Python Head First学习笔记
- Simulink 快速入门(二)--创建简单模型
- 关于 np.arccos/arcsin 计算之前需要必须要 np.clip 的那件小事儿
- 如何在资源管理器中恢复“最近文件夹”
- php 判断中文和英文,php如何判断是中文还是英文
- Python数据分析入门--层次分析法学习笔记
热门文章
- 中南大学计算机网络期末试卷,中南大学计算机网络期末复习试卷1
- jquery pager 访问 java_基于JQuery的Pager分页器实现代码
- 计算机科学与技术专业导论_“课程思政”建设经验分享 | 王振武:专业导论(计算机科学与技术)...
- java simpleentry_使用Java流生成对象
- c++小程序代码_# 微信小程序的原生框架和taro对比 ##
- 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
- 未使用的分配java,最近最久未使用页面淘汰算法———LRU算法(java实现)
- Python raw_input()
- java组合与继承始示例_Java 8特性与示例
- xxl_job springboot改造