一、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)相关推荐

  1. Tomcat源码分析(九)--Session管理

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...

  2. 【Tomcat源码阅读】核心组件介绍(二)

    Tomcat总体结构 Tomcat总体结构用下图来表示 图片摘自:https://blog.csdn.net/jiaomingliang/article/details/47393141 从上图可以看 ...

  3. (五)Tomcat源码阅读:Connector组件分析

    一.概述 因为Connector组件没有实现接口规范,因此我们直接对该类的方法进行分析即可. 二.源码阅读 阅读思路,我的阅读思路是这样的,大的类无非就是对小类的使用,因此我们想分析整体的一下架构的化 ...

  4. mybatis源码分析之事务管理器

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...

  5. Tomcat 源码阅读记录(1)

    使用Ant 工具进行编译打包. 源码对应关系: SourceCode TargetPackage /bin /bin /conf /conf /java /lib/* /Modules 依赖包 /re ...

  6. Kafka源码阅读-Controller(二)管理brokers

    上一篇kafka源码(一)correspond to/explain Kafka设计解析(二) 中的3.2.3.3.以前一直用kafka 0.8.2.x,那时候redis开始风靡,hadoop方兴未艾 ...

  7. postgres 源码解析9 CLOG管理器--1

    1 背景介绍   在Postgres数据库的日志管理系统中,采用CLOG日志记录集群中每个事务的最终状态,在内存中形式是基于SLRU缓冲实现的,有兴趣的回顾下SLRU相关知识:   1 postgre ...

  8. postgres 源码解析25 缓冲池管理器-3

      本文讲解缓冲块的选择策略BufferAlloc,同时该函数也是替换策略的核心函数, 知识回顾: postgres源码解析 缓冲池管理–1 postgres源码解析 缓冲池管理–2 总结<执行 ...

  9. Tomcat源码阅读---ServletContext.java(小白写作,持续更新)

    everybody,想我没,刚考完操作系统,我胡汉三又回来啦!!!掌声!!!鲜花!!!接着奏乐,接着舞!!!来个大的!不要说我不够意思,这个ServletContext读完的确是让我对于web程序有了 ...

最新文章

  1. .NET平台BigO算法复杂度备忘
  2. 【python】【scrapy】使用方法概要(三)
  3. Apache Httpd常用命令
  4. Linux文件系统基础(1)
  5. Spring Boot基础学习笔记:可视化迎新
  6. CoinDesk将发布2018年比特币和区块链行业报告
  7. Halcon缺陷检测——测量拟合
  8. memcached教程_Memcached教程
  9. 【修正】Q93:PLY文件对应图形法向量反向问题——以bunny10K为例
  10. HTTP头部POST表单详解
  11. python使用webdriver处理上传文件(使用AutoIt)
  12. 读书-算法《程序设计导引及在线实践》-简单计算题2:棋盘上的距离
  13. 智能门锁的优劣,我们应该如何有效识别?
  14. smart3D的初探索
  15. Python Head First学习笔记
  16. Simulink 快速入门(二)--创建简单模型
  17. 关于 np.arccos/arcsin 计算之前需要必须要 np.clip 的那件小事儿
  18. 如何在资源管理器中恢复“最近文件夹”
  19. php 判断中文和英文,php如何判断是中文还是英文
  20. Python数据分析入门--层次分析法学习笔记

热门文章

  1. 中南大学计算机网络期末试卷,中南大学计算机网络期末复习试卷1
  2. jquery pager 访问 java_基于JQuery的Pager分页器实现代码
  3. 计算机科学与技术专业导论_“课程思政”建设经验分享 | 王振武:专业导论(计算机科学与技术)...
  4. java simpleentry_使用Java流生成对象
  5. c++小程序代码_# 微信小程序的原生框架和taro对比 ##
  6. 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
  7. 未使用的分配java,最近最久未使用页面淘汰算法———LRU算法(java实现)
  8. Python raw_input()
  9. java组合与继承始示例_Java 8特性与示例
  10. xxl_job springboot改造