深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

32 | Manager组件:Tomcat的Session管理机制解析

afterSessionCreated
beforeSessionCreated
fireSessionEvent
findSessions
StandardSessionFacade
Session
HttpSession
tellNew
HttpSessionEvent
processExpires
StandardSession
ConcurrentHashMap
sessionDestroyed
sessionCreated
backgroundProcess
createSession
HttpSessionListener
ContainerBackgroundProcessor
StandardManager
Session事件通知
Session的清理
Session的创建
Tomcat的Session管理机制解析
参考文章

该思维导图由 AI 生成,仅供参考

我们可以通过 Request 对象的 getSession 方法来获取 Session,并通过 Session 对象来读取和写入属性值。而 Session 的管理是由 Web 容器来完成的,主要是对 Session 的创建和销毁,除此之外 Web 容器还需要将 Session 状态的变化通知给监听者。
当然 Session 管理还可以交给 Spring 来做,好处是与特定的 Web 容器解耦,Spring Session 的核心原理是通过 Filter 拦截 Servlet 请求,将标准的 ServletRequest 包装一下,换成 Spring 的 Request 对象,这样当我们调用 Request 对象的 getSession 方法时,Spring 在背后为我们创建和管理 Session。
那么 Tomcat 的 Session 管理机制我们还需要了解吗?我觉得还是有必要,因为只有了解这些原理,我们才能更好的理解 Spring Session,以及 Spring Session 为什么设计成这样。今天我们就从 Session 的创建、Session 的清理以及 Session 的事件通知这几个方面来了解 Tomcat 的 Session 管理机制。

Session 的创建

Tomcat 中主要由每个 Context 容器内的一个 Manager 对象来管理 Session。默认实现类为 StandardManager。下面我们通过它的接口来了解一下 StandardManager 的功能:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat的Session管理机制是Web容器完成的,主要包括Session的创建、清理和事件通知。通过Request对象的getSession方法可以获取Session,并通过Session对象读取和写入属性值。Tomcat中由每个Context容器内的一个Manager对象来管理Session,默认实现类为StandardManager。Session的创建由Manager组件完成,创建后会被保存到ConcurrentHashMap中。Session的清理由Tomcat后台线程调用的backgroundProcess方法完成,每60秒执行一次。在Session的生命周期过程中,Tomcat会通知监听者,通过HttpSessionListener接口实现事件通知。文章详细介绍了Tomcat的Session管理机制,帮助读者更好地理解Spring Session的设计原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • -W.LI-
    session是会话的生命周期,每次请求都会重置超时时间,TCP链接超时,链接就被回收了(节约资源),如果session没失效可以从新创建TCP链接通过sessionId找到之前的会话。sessionId存在cookie里面,通过http协议的head头传过来。 老师好,感觉设计模式大多的作用就是,解耦,复用,提高系统的简装性,灵活性,还有别的作用么? 有个问题,之前听隔壁班的老师说,在数据量大的时候ConcurrentSkipMap()juc下基于条表实现性能比ConcurrentHashMap性能好。可是Tomcat管理session还是用的ConcurentHashMap()。是不够多么,大概多少量级以后用跳表比较合适啊?谢谢老师

    作者回复: 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右。 但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点: 1、ConcurrentSkipListMap 的key是有序的。 2、ConcurrentSkipListMap 支持更高的并发。ConcurrentSkipListMap 的存取时间是log(N),和线程数几乎无关。也就是说在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势。  参见:http://www.java-forums.org/new-java/13840-hashmap-vs-skiplistmap.html

    2019-07-23
    32
  • 永钱
    Tcp是系统网络层面的,而session是应用层面的,应用层面完全由应用控制生命周期,他们之间没什么关系。不知道理解对不对,求指正

    作者回复: 对的

    2019-07-23
    2
    15
  • 发条橙子 。
    老师 我有个其他的疑问,一般我们用tomcat起java程序的时候都用的jvm的默认参数,那如果我想更改一些jvm参数 ,应该在tomcat哪里配置

    作者回复: 在bin目录下新建一个setenv.sh的文件,在这个文件里加jvm参数

    2019-07-24
    11
  • L.B.Q.Y
    StandardManager持有的sessions这个ConcurrentHashMap,其Key是sessionId对吧,这个sessionId是通过cookie送进来的是吗?如此,同一个主机上发送来的请求就能和指定的session关联在一起。

    作者回复: 对的

    2019-09-18
    5
  • 梁中华
    不谈下分布式session在tomcat中的实现吗?比如多个tomcat实例如何共享session?

    作者回复: 下篇会讲这个

    2019-07-24
    2
  • WL
    老师请问一下如果是集群部署的Tomcat容器怎么实现分布式的session,还能有standardManager管理吗?我看有filestore和jdbcstore两个类,但是感觉靠这两个类好像也没法实现,请老师指点一下具体怎么集群情况下的session管理

    作者回复: 下篇会讲到

    2019-07-23
    1
  • 学无涯
    HttpSessionEvent event = new HttpSessionEvent(getSession()); 没太明白HttpSessionEvent 的作用是什么

    作者回复: Event只是一个“事件”类,万物皆对象

    2019-08-14
  • magicnum
    一个是传输层连接的断开时间,另一个是应用层用户会话的过期时间,两者没啥关系,但是超时目的其实都是为了减少服务器资源占用
    2019-07-23
    4
  • 完美世界
    tcp 是传输层协议,连接过期,需要重新三次握手。Session,是服务端的凭证,过期,表示会话过期,需要重新连接。此时tcp可能未过期。
    2019-09-17
    1
  • | ~浑蛋~
    请问一下,session的isValid状态由谁来维护
    2022-08-01归属地:广东
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部