在使用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. centos搭建NFS网络文件系统

    NFS服务器端 安装NFS服务器非常之简单: yum install nfs-utils protmap 这样就安装好了,其中nfs-utils是提供NFS服务器程序和相应的管理工具.protmap是 ...

  2. Scrum会议(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  3. 如何通过maven ,将本地jar 安装到仓库中去。

    场景: 现在很多公司,都有 maven 的私服 ,在maven项目中,基本上有两个仓库 ,一个是maven的公共仓库,一个是私服仓库: 有的时候,我们download 别人的代码的时候,pom文件中报 ...

  4. Xshell连接Linux下Oracle无法回退的解决办法

    使用Xshell 连接远程Linux 数据库服务器,当切换到sqlplus 控制台时,输入错误字符的时候,使用回退键修改时,显示^H. 解决方法: 在控制太命令中输入stty erase ^H 回车就 ...

  5. js取最小最大值--Math.min()、math.max()

    一.Math.min() 返回一组表达式中最小者 eg: var n = Math.min( 2 , 30 ,1 , 200-10 , 300*22 , 20-30 ); alert(n); //打印 ...

  6. iOS.OpenSource.AllInOne

    Open Source Project for iOS 所有和iOS相关的Open Source Project的汇总. 功能点 开源项目   iOS Gallery RMGallery https: ...

  7. Tomcat Xms Xmx PermSize MaxPermSize 区别 及 java.lang.OutOfMemoryError: PermGen space 解决

    解决方案 在 catalina.bat 里的 蓝色代码前加入: 红色代码 rem ----- Execute The Requested Command ----------------------- ...

  8. load data ERROR 1197 (HY000)错误

    有一份csv格式的文件,大小在14G左右.max_binlog_cache_size=4G. 登录mysql实例,选择对应的表通过load data往指定表里导数.大概20分钟左右,报以下错误: ER ...

  9. JSONP跨域数据调用

    引自:http://kb.cnblogs.com/page/139725/ Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如& ...

  10. IPD模式下开展敏捷开发的一些问题汇总

    1.      我们现在普遍用的是老系统情况下,什么时候把软件和硬件在敏捷项目里面集成? 答:有两种场景:第一种场景是把软件分几个迭代,最后把软件和硬件一起集成:第二种场景是更好的一种场景,每几个迭代 ...