Tomcat中session的管理机制

详细描述Tomcat中session的管理机制:

1. 请求过程中的session操作:

简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中。然后再从 request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session,如果sessionId不 存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用。

(1)SessionId解析过程时序图:

概述:首先用户发送一个http请求传递给Http11Processor,经由Http11Processor解析封装在org.apache.coyote.Request然后传递给CoyoteAdapter,coyoteAdapter是一个适配器,将coyote框架封装的org.apache.coyote.Request适配给org.apache.catalina.connector.Request(这个流程不多说,之前都有总结过),转换完之后会调用parsePathParameters方法去解析路径参数中的cookie信息(因为当cookie被浏览器禁用时,会将cookie信息重写进url),先尝试从url中尝试解析出sessionId. 然后会调用parseSessionCookiesId,这个就是从cookie中解析sessionId存到request(parsePathParameters和parseSessionCookiesId方法,在调用过程中,没有看到明显的异或逻辑,即两者都执行了,但这样不是就有问题了吗?想想其实没有问题的,URL重写设置sessionId或者放到cookie中传递过来,两者方式只会用一个,想到这点就知道没有问题了)解析到sessionId就放到了request里面。解析SessionId的逻辑就ok了。

下面贴出关键代码:

ParsePathParameters方法(从重写URL中解析):

Ps: 标记出来的部分分别是从URL解析出变量,然后放到request参数列表里面。

parseSessionCookiesId方法(从cookie中解析出sessionId):

Ps: 上面的标记就是从cookie中获取sessionId.看第一个标记有个SessionConfig.getSessionCookieName(context)的调用,这里会获取到一个默认的sessionId的key,这个key是定义在SessionConfig中的,其值为jsessionId:

(2) 从请求中获取session的流程基本就是上文描述的这样。那么再看一下Servlet获取session的流程:

概述:appServlet是我们自己定义的一个Servlet,在通过Reqest获取session的时候,其实调用的这个HttpServletRequest(是一个接口)其实是RequestFacade(封装了org.apache.catalina.connector.Request的一个门面),然后RequestFacade会调用真实的Request的getSession方法。Request具体的逻辑是调用Context容器的getManger方法获取Session管理器(session管理器详情下文介绍),然后如果SessionId如果已经被解析出来了,那么则会调用findSession方法从session对象池中获取对应的session,反之如果sessionId不存在,则需要重新创建一个Session,并放入session对象池中。

下面贴出关键代码:

类RequestFacade的getSession方法:

类Request的getSession方法:

类Request的doGetSession方法:

Ps:第一个标记就是根据SessionId从session对象池中获取session信息,第二标记就是在没有解析到sessionId的情况下创建一个新的Session对象。

这个创建一个新的session这里点涉及到新的sessionId的生成,生成sessionId的逻辑关键代码是在类SessionIdGenerator中的generateSessionId方法中定义:

以上即是Servlet获取session的流程,下文具体总结一下tomcat是怎么来管理Session的,即session管理器的知识。

2. Session的管理机制

Session管理器定义:Session管理器组件负责管理Session对象,例如,创建和销毁Session对象。

首先看一张Session管理器的类继承结构图(这个是tocmat7.x的图,tomcat5的类继承机构和这个有很大不同):

简述:下面依次总结下每个类(参考官网信息):

(1)Manager:定义了关联到某一个容器的用来管理session池的基本接口。

(2)ManagerBase:实现了Manager接口,该类提供了Session管理器的常见功能的实现。

(3)StandardManager:继承自ManagerBase,tomcat的默认Session管理器(不指定配置,默认使用这个),是tomcat处理session的非集群实现(也就说是单机版的),tomcat关闭时,内存session信息会持久化到磁盘保存为SESSION.ser,再次启动时恢复。

(4)PersistentManagerBase:继承自ManagerBase,实现了和定义了session管理器持久化的基础功能。

(5)PersistentManager:继承自PersistentManagerBase,主要实现的功能是会把空闲的会话对象(通过设定超时时间)交换到磁盘上。

(6)ClusterManager:实现了Manager接口,通过类名应该能猜到,这个就是管理集群session的管理器和上面那个StandardManager单机版的session管理器是相对的概念。这个类定义类集群间session的复制共享接口。

(7)ClusterManagerBase:实现了ClusterManager接口,继承自ManagerBase。该类实现了session复制的基本操作。

(8)BackupManager:继承自ClusterManagerBase, 集群间session复制策略的一种实现,会话数据只有一个备份节点,这个备份节点的位置集群中所有节点都可见。这种设计使它有个优势就是支持异构部署。

(9)DeltaManager:继承自ClusterManagerBase,集群建session复制策略的一种实现,和BackupManager不同的是,会话数据会复制到集群中所有的成员节点,这也就要求集群中所有节点必须同构,必须部署相同的应用。

补充:下面再具体总结一点就是在PersistentManagerBase类中有个成员变量Store:

持久化session管理器的存储策略就是有这个Store对象定义的,这个Store的类继承结构如下:

简述:接口Store及其实例是为session管理器提供了一套存储策略,store定义了基本的接口,而StoreBase提供了基本的实现。其中FileStore类实现的策略是将session存储在以setDirectory()指定目录并以.session结尾的文件中的。JDBCStore类是将Session通过JDBC存入数据库中,因此需要使用JDBCStore,需要分别调用setDriverName()方法和setConnectionURL()方法来设置驱动程序名称和连接URL。

3. Tomcat session相关的配置

从两个层面总结一下session相关的配置和设置。首先是从配置文件层面,session是有过期时间的,这个默认的过期时间是在$catalina_home/conf/web.xml有定义的。具体的默认配置如下(默认的过期时间是30min,即30min没有访问,session就过期了):

还有一点就是session管理如果不配置就默认使用StandardManager,但如果要配置的话可以在$catalina_home/conf/context.xml当中指定(其中从这个配置当中可以看到session管理器是和context容器关联的,也就说每个web应用都会有一个session管理器)具体的配置如下:

Tomcat7.x默认这个manager的配置是注释掉的。如果要指定的PersistentManager为默认管理器的话可以这么指定:

其实看到这也就发现了,其实session管理器或者Store存储策略,只要实现了相关的接口,都是可以自定义的。自己写一个配置在这里就ok了。

另外在从代码层面总结一下:session的一些配置信息是写死在代码里的,比如SessionConfig这个类就定义了一些session的设置信息。Session在cookie中的名字是JSESSION. Session通过URL重写的方式放在path里时,键值的名字是jsessionids,具体的代码如下:

还有一点就是sessionId默认指定的长度是16个字节,这个在SessionIdGenerator当中指定:

好了,有关默认配置的就先总结这么多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中tomcat memecached session 共享同步问题的解决办法

    事件缘由:一个主项目"图说美物",另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 web项目windows系统下实现session的共享 第一个步: 在俩个tomcat的context.xml这个文件中配置如下代码: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManage

  • nginx+tomcat实现负载均衡,使用redis session共享

    环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel #注意 : 安装nginx必须使用 root 用户安装 #创建一个nginx目录 mkdir /usr/local/src/nginx #进入到

  • 深入浅析TomCat Session管理分析

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对于使用Tomcat作为Web容器的大部分开发人员而言,Tomcat是如何实现Session标记用户和管理Session信息的呢? 概要 SESSION Tomcat内部定义了Session和HttpSession这两个会话相关的接口,其类继承体系如图1所示. 图1 Session类继承体系 图1中额

  • Tomcat集群和Session复制应用介绍

    一个配置文件: 复制代码 代码如下: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false"

  • Tomcat中实现Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录: Session的主要目的就是为了弥补Http的无状态特性.简单的说,就是服务器可以利用session存储客户端在同一个会话期间的一些操作记录: 实现机制 先看两个问题,如下: 1.服务器如何判断客户端发送过来的请求是属于

  • Tomcat实现session共享(session 会话复制)

    一.如何保持session会话 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案: 1.请求精确定位:session sticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中

  • Tomcat中session的管理机制

    详细描述Tomcat中session的管理机制: 1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session,如果sessionId不 存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用. (1)SessionId

  • Nginx+Tomcat关于Session的管理的实现

    前言 Nginx+Tomcat对Session的管理一直有了解,但是一直没有实际操作一遍,本文从最简单的安装启动开始,通过实例的方式循序渐进的介绍了几种管理session的方式. nginx安装配置 1.安装nginx [root@localhost ~]# yum install nginx 提示报如下错误: No package nginx available. 解决办法安装epel:EPEL是企业版 Linux 附加软件包的简称,EPEL是一个由Fedora特别兴趣小组创建.维护并管理的,

  • tomcat中Servlet的工作机制详细介绍

    tomcat中Servlet的工作机制 在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法.对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持. 在tomcat中消息流的流转机制是通过四个不

  • php中Session的生成机制、回收机制和存储机制探究

    1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问,我们都知道session是保存在服务器的,既然它用于保持每一个用户的状态那它利用什么来区别用户的呢?这个时候就得借助cookie了.当我们在代码中调用session_start();时,PHP会同时往SESSION的存放目录(默认为/tmp/)和客户端的cookie目录各生成一个文件.sessio

  • python中的属性管理机制详解

    目录 一.私有属性 二.属性限制-__slots__方法 三.python中如何去声明变量 四.python中的有关属性 一.私有属性 Python并没有真正的私有化支持,但可用下划线得到伪私有,有一项大多数 Python 代码都遵循的习惯:带有下划线,前缀的名称应被视为非公开的 API 的一部分(无论是函数. 方法还是数据 成员) python中私有并没有实现真正的私有,只是在保存属性的时候改了个名字,在外部无法直接方法 私有属性具体表现为: _参数名 : 声明式私有属性 __参数名 : _类

  • php中session垃圾回收机制

    在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾.PHP会将其在内存中销毁:这是PHP的GC垃圾处理机制,防止内存溢出. GC的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟),就将该session删除. 当一个有效的请求发生时,PHP 会根据全局变量 session.gc_probability和session.gc_divisor

  • Tomcat中的Session与Cookie深入讲解

    前言 HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求.而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后续请求提供已登录信息的能力.本文首发于公众号顿悟源码. 解决办法就是使用 Cookie,它由服务器返回给浏览器,浏览器缓存并在每次请求时将 cookie 数据提交到服务器.Cookies 在请求中以明文传输,且大小限制 4KB,显然把所有状态数据保存在浏览器是不靠谱的,主流做法是: 浏览器发出

  • Session的工作机制详解和安全性问题(PHP实例讲解)

    我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. 我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任.因为,这里面的方法很多,可以这么说吧,没有最好,只

  • Django中session进行权限管理的使用

    目录 1.urls.py 2.login/models.py 3.views.login和login.html 4.views.index 4.views.index 5.views.logout 6.总结session和forms的搭配 当session启用后,传递给视图request参数的HttpRequest对象将包含一个session属性,就像一个字典对象一样.你可以在Django的任何地方读写request.session属性,或者多次编辑使用它. 这个文件在我的C:\Users\17

随机推荐