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>

阅读全文
0 0
原创粉丝点击