Tomcat7.0.42源码研读之Session管理(八)
来源:互联网 发布:sqlserver 索引维护 编辑:程序博客网 时间:2024/05/18 00:45
我们在写Java Web程序的时候,往往需要用到Session保存用户登录状态。
在需要用到Session的时候一般都是调用HttpServletRequest的getSession() 或者getSession(boolean create)方法,那Tomcat的Session是怎么运作的呢?
程序实际运行过程中,HttpServletRequest的实现类是org.apache.catalina.connector.RequestFacade,它是org.apache.catalina.connector.Request的外观模式类,也就是说
实际上还是交由Request来处理的。那我们看下org.apache.catalina.connector.Request的getSession方法的代码:
上面这个Manager是StandardManager的实例,它用一个ConcurrentHashMap<sessionID , Session>保存着Tomcat所有的Session对象。Request的getSession方法里面会判断requestedSessionId是否为空,这个是在解析HTTP请求头里面的COOKIE参数中JSESSIONID字段得来的,然后交由StandardManager从ConcurrentHashMap根据Key获取到这个对应的Session实例。Tomcat目前支持3种Session会话追踪模式(Cookie 、URL重写 、SSL),所谓追踪模式是指Tomcat服务器通过何种方式从请求中获得会话标识(可配置多个),当客户端浏览器不支持Cookie的时候可以采用URL重写的方式。Tomcat在生成Session实例之后,会为这个Session生成对应的Cookie,如下:
Tomcat创建sessionID的工作主要由org.apache.catalina.util.SessionIdGenerator工具类来完成,经过笔者的测试,这个生成算法非常高效,单机生成10万个sessionID耗时也不过2秒左右的时间,美中不足的是这个sessionID是个32位的字符,有点大,有需要的话可以在这个的算法基础上面改进一下作为分布式ID生成算法。但是Tomcat出于自身非常严谨的考量,每次生成sessionID之后还要做一下防止重复冲突校验,如果冲突那么就重新生成一次。
Session既然有个过期时间设置,那Tomcat是如何处理这些过期的Session实例呢?原来org.apache.catalina.session.ManagerBase类有个backgroundProcess方法每隔一段时间就遍历保存着所有Session的ConcurrentHashMap,判断是否到了过期时间,如下:
Tomcat的Session管理器有两个,分别是StandardManager和PersistentManager ,但Tomcat默认采用的是StandardManager , Tomcat默认对Session开启持久化配置,所谓Session的持久化是指将保存在内存中的Session持久化保存到本地磁盘文件中去,如果想禁用持久化功能,则在Tomcat的conf/context.xml文件中将一下注释掉的开启:
整理下StandardManager和PersistentManager两者的区别:
Session管理器介绍StandardManagerTomcat默认。它的机制为:当Tomcat服务器接到关闭或者重启的命令后,或者Web应用被重新加载(注意:如果是突然中止Tomcat服务器,即不是调用./shutdown.sh或者./restart.sh命令,服务器保存的Session对象全部会丢失,因为StandardManager还没来得及将内存持久化到磁盘文件),会对存在内存中的Session对象持久化保存到本地磁盘文件中,默认的文件为:$CATALINA_HOME/work/Catalina/hostname/applicationname/SESSIONS.ser , 如需要,可以在<Context>节点下配置:
<Manager className="org.apache.catalina.session.StandardManager”
debug="0”maxInactiveInterval="-1″
/>
PersistentManagerPersistentManager可以把内存中的Session对象保存到Session Store中,它提供了比StandardManager更为灵活的持久化管理机制,具体表现如下:1、对内存中的Session对象持久化,保存到Session Store中去
2、具有容错功能,可以及时把Session对象备份到Session Store中去,当Tomcat服务器意外关闭后重启,可以从Session Store中恢复Session对象
3、可以灵活控制内存中Session的数目,可以将部分Session转移到Session Store中
4、支持两种持久化机制:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore
配置使用PersistentManager的方式为:
<Manager className="org.apache.catalina.session.PersistentManager"
debug="0"
saveOnRestart="false"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1">
<Store className="org.apache.catalina.session.FileStore" directory="../session" />
</Manager>
- Tomcat7.0.42源码研读之Session管理(八)
- Tomcat7.0.42源码研读之BIO(七)
- Tomcat7.0.42源码研读之组件生命周期Lifecycle(一)
- Tomcat7.0.42源码研读之网络连接器Connector(三)
- Tomcat7.0.42源码研读之组件说明(四)
- Tomcat7.0.42源码研读之网络框架Coyote(六)
- Tomcat7.0.42源码研读之职责链模式Pipeline与Valve(二)
- hadoop源码研读之路(八)----DataNode本地数据块管理
- hadoop源码研读之路(八)----DataNode本地数据块管理
- Tomcat7.0.42源码研读之类加载器(五)
- Tomcat7.0源码分析——Session管理分析(上)
- Tomcat7.0源码分析——Session管理分析(下)
- Tomcat7.0源码分析——Session管理分析(上)
- Slim研读笔记八之路由(上)
- Slim研读笔记八之路由(中)
- Hibernate(八)---管理Session
- hadoop源码研读之路(二)----配置类
- hadoop源码研读之路(三)----序列化
- 使用Feign实现声明式Restful风格调用
- web环境安装相关
- 网络字节顺序NBO(Network Byte Order)和主机字节顺序(HBO,Host Byte Order)转换
- 遇到的浏览器兼容问题
- Mac 安装 talib
- Tomcat7.0.42源码研读之Session管理(八)
- Object.keys() 获取对象的length
- Java基础——类加载机制及原理
- AOP Observable
- Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)
- Maven中module和parent标签的填写方式
- Spring-Boot (三) 默认日志logback配置
- 软考错题合集之17-05-PM
- js向服务器发送请求,获取服务器时间