在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的。

目录

  • 概述
  • session的作用
  • session新建、查找和更新
  • session删除
  • 总结

概述

在tomcatsession管理的类标准实现为StandardManager,主要作用为启动的是加载缓存的session,类关系如下:

在用户servlet中使用的session为StandardSessionFacade(也是使用了facade模式,类似request),类关系如下:

session的作用

因为http协议是无状态的,但是在实际使用中我们需要知道上次请求保存在服务器端的数据,这个时候就用到了session,结合客户端的cookie就可以实现暂时在服务器端存储部分数据。但是注意,cookie并不是仅仅为了配合session而存在,cookie主要用来客户端来存储一些数据。和普通cookie不一样的地方是,和session相关的cookie 是由服务器端返回给浏览器,由浏览器自动设置的,不需要开发人员参与。

session新建、查找和更新

session新建

因为在一次请求中session不是必要的,所以tomcat 不是一定会创建session,只有在使用到了才会创建新的session,比如在UserServlet中使用到了session,创建过程如下:

非红框圈住的部分是session新建的过程,在request.addSessionIdInternal方法中将session作为cokkie设置到response头信息中,浏览器中收到"set-cookie"头信息的时候会将该头信息的值设置到cookie中,下次请求的时候会带上。

session查找

当同一个客户端在有效时间内(默认是30分钟,也是session的默认过期时间)第二次请求来了的时候,在CoyoteAdapter.postParseRequest方法内解析request请求头信息获取cookie(如果有的话),然后将cookie作为sessionId(其实cookie就是sessionId)设置到request对象中,在servlet 中调用getSession的时候,如果根据该sessionId查找到了session,则不会新建,否则才会新建。

调用过程如上图中左上方的红框。

session更新

因为session有过期时间,tomcat会记录该session的lastAccessedTime,更新session也就是更新这个时间,调用过程如上图中最下面的红框。

session删除

默认session是有过期时间,而且保存在内存中的,如果,一直不删除session,最后肯定会撑爆内存,在tomcat 中删除session的情况有两种:

  • 在新的请求来的时候,如果查找到对应的session了会验证session是否可用(过期),如果过期了就会删除该session
  • 在daemon线程(ContainerBase$ContainerBackgroundProcessor.processChildren中StandardContext->ContainerBase.backgroundProcess中调用StandardManager->ManagerBase.backgroundProcess)中定时检查是否过期,如果 过期则删除。

总结

到这里tomcat源码阅读基本上已经完成,大体脉络已经很明确,收获颇多,第一次阅读源码确实感觉到了一个好的开源项目的强大之处。


这段时间来的图(使用astah绘制)和笔记

http://pan.baidu.com/s/1dF2sGpj

How Tomcat works — 八、tomcat中的session管理的更多相关文章

  1. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  2. [转]tomcat中的session管理

    转载地址:http://blog.csdn.net/iloveqing/article/details/1544958 当一个sesson开始时,Servlet容器会创建一个HttpSession对象 ...

  3. 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

    一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...

  4. (八) Hibernate中的Session以及事务

    HibernateUtil.getSessionFactory().getCurrentSession() 和HibernateUtil.getSession() 的区别: 1.异:getCurren ...

  5. How Tomcat Works(十二)

    tomcat容器通过一个称为Session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示:Session管理器必须与一个Contex ...

  6. Tomcat的Session管理机制

    >>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...

  7. Tomcat源码分析——Session管理分析(上)

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...

  8. 微服务架构下分布式Session管理

    转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”. 一.应用架构变 ...

  9. TOMCAT8源码分析——SESSION管理分析(上)

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...

随机推荐

  1. web工程中URL地址的推荐写法

    三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ...

  2. linux开机启动

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机 ...

  3. linux中时间的更改

    # tzselectPlease identify a location so that time zone rules can be set correctly.Please select a co ...

  4. Shi-Tomasi角点检测

    代码示例: #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #inc ...

  5. eclipse里面设置JVM参数的问题

    在run----run configuration---Agruments里面设置JVM的参数:  -Xms256m   -Xmx1024m 肯定还有别的方式设置,今天就先写这一种方法.待续...

  6. iOS键盘出现时界面跟着往上推

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShow:) name:UI ...

  7. python 内置函数 map filter reduce lambda

    map(函数名,可遍历迭代的对象) # 列组元素全加 10 # map(需要做什么的函数,遍历迭代对象)函数 map()遍历序列得到一个列表,列表的序号和个数和原来一样 l = [2,3,4,5,6, ...

  8. IOS开发 模型赋值 runtime

    #import "CZJsonObject.h" #import <objC/runtime.h> #import <objc/message.h> NSS ...

  9. yield学习续:yield return迭代块在Unity3D中的应用——协程

    必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...

  10. git --如何撤销已放入缓存区(Index区)的修改

    修改或新增的文件通过 git add --all 命令全部加入缓存区(index区)之后,使用 git status 查看状态(git status -s 简单模式查看状态,第一列本地库和缓存区的差异 ...