深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

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

李号双 2019-07-23
我们可以通过 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • -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
    12
  • 永钱
    Tcp是系统网络层面的,而session是应用层面的,应用层面完全由应用控制生命周期,他们之间没什么关系。不知道理解对不对,求指正

    作者回复: 对的

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

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

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

    作者回复: 对的

    2019-09-18
    1
  • magicnum
    一个是传输层连接的断开时间,另一个是应用层用户会话的过期时间,两者没啥关系,但是超时目的其实都是为了减少服务器资源占用
    2019-07-23
    1
  • Geek_rebel
    对Request对象进行包装,这种操作是用的装饰者模式吗?
    2019-12-10
  • Mr.差不多
    我想请教一下,就是在tomcat中session的过期时间是什么时候重置的? 是在下一次获取到这个session中的数据的时候?还是随便向后台发送个请求就可以?
    2019-12-03
  • Geek_00d567
    tcp 是传输层协议,连接过期,需要重新三次握手。Session,是服务端的凭证,过期,表示会话过期,需要重新连接。此时tcp可能未过期。
    2019-09-17
  • 听雨
    HttpSessionEvent event = new HttpSessionEvent(getSession());
    没太明白HttpSessionEvent 的作用是什么

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

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

    作者回复: 下篇会讲这个

    2019-07-24
  • 小飞
    其实在StandardManager 中没有 backgroundProcess()和 processExpires()的具体实现的。他们的实现提取到了基类ManagerBase中
    2019-07-23
  • WL
    老师请问一下如果是集群部署的Tomcat容器怎么实现分布式的session,还能有standardManager管理吗?我看有filestore和jdbcstore两个类,但是感觉靠这两个类好像也没法实现,请老师指点一下具体怎么集群情况下的session管理

    作者回复: 下篇会讲到

    2019-07-23
收起评论
12
返回
顶部