• tomcat源码阅读之session管理器(Manager)


    一、UML图分析:

    (一) Session:

    Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认是60秒,如果超过60秒该客户端没有再发送请求信息过来,则服务器会删除该session;

    1、每个session有一个唯一的id用来区分不同的session;

    2、从session的构造函数可以看出session必须关联一个manager对象,manager是session管理器;

    3、MaxInactiveInterval是session在无访问时最大生存时间,默认60秒,可以通过setMaxInactiveInterval来设置这个值,判断session是否失效时是拿当前时间和LastAccessTime来比较,每当访问一个session时会调用其access方法来更新LastAccessTime值;

    4、Attributes属性保存了session相关属性值,这个属性是一个hashmap类型的,可以通过名称快速查找到对应的属性;

    5、当session失效时会调用invalidate将session进行失效,invalidate会调用expire来将session失效;

    6、当servlet程序员调用Request.getSession时,返回的是StandardSession的门面对象StandardSessionFacade,所有的访问都是转给StandardSession对象的,保证了servlet程序员能安全的访问session对象;在Request.getSession中可以看到要获取到对应的session时,先从context中获取manager对象,然后从manager中查找指定id的session,如果查找不到则调用createSession创建新的session对象;

    (二) Manager:

    Manager作为session管理器,session既可以存储在内存中,也可以存储到存储设备中,StandardManager将session存储在内存中,PersistentManagerBase作为将session存储在存储设备的基类,子类DistributedManager实现session的集群管理;

    1、      manager通过getContainer和setContainer将manager与context容器相关联;

    2、      sessions变量是一个hashMap类型的,存储了所有的session,createSession创建一个新的session并添加到这个hashMap中,add添加session,remove删除session,findSession查找指定id的session;

    3、      unload将sessions变量中的session保存到磁盘上,load将磁盘上的session文件加载到内存中;

    4、      StandardManager的stop方法会调用unload方法将有效的session保存到SESSION.ser的文件中,每个Context容器都会产生这样一个文件,这个文件位于CATALINA_HOME指定目录下的work目录中;

    5、      processExpires方法会销毁管理器中那些已经失效的session,失效时间值可以通过设置maxInactiveInterval的值来设置,该值默认为60秒;但是在setContainer中关联manager与Context时,会将该值改为Context.SessionTimeOut值,这个值默认为30分钟;

    6、      maxActiveSessions变量设置了允许的最大活动session的数量,一旦超过这个值时,就不允许再创建新的session;

    7、      PersistentManagerBase类实现了session的换出和备份:当活动session数量超过MaxActiveSessions时(processMaxActiveSwaps),或者session闲置时间超过maxIdleSwap时(processMaxIdleSwaps),就需要将session换出到存储设备;当session闲置时间超过maxIdleBackup时,会将该session备份到存储设备(processMaxIdleBackups);

    (三) Store(存储器):

    存储器store是用于将session持久化的组件;

    1、Store接口中的load和save方法分别用于将session从磁盘加载到内存对象和将内存中的session存储到磁盘上,但是这两个方法在storeBase中均没有实现,而是在其子类FileStore和JDBCStore中实现;

    2、storeBase中的processExpires方法从所有活动的session中移除过期的session;

    3、fileStore会将每个session单独存储为一个文件,文件名为“sessionId.session”,位于临时的工作目录下,也可以调用FileStore.setDirectory方法修改临时目录的位置;

    4、JDBCStore的load和save方法分别用于将session从数据库加载和将session保存到数据库中,因此需要设置其setDriverName和setConnectionURL来设置数据库连接信息,操作的表名存储在sessionTable中,操作的字段有:sessionIdCol、sessionDataCol、sessionValidCol、sessionMaxInactiveCol、sessionLastAccessedCol,这几个字段都有默认值,可以通过对应的set方法来修改;

    二、集群管理:

    DistributedManager实现了session的集群管理,其集群管理是通过ClusterSender和ClusterReceiver来实现的,ClusterSender用于将session广播到集群中的其他节点,ClusterReceiver用于接受到其他节点广播过来的session时,将流还原成内存中的session对象;

    1、createSession时,首先创建一个session对象,然后将其序列化为流对象,最后使用ClusterSender将其广播到其他节点,代码如图:

    2、DistributedManager本身也是一个线程对象,在线程中定时执行processClusterReceiver,这个方法将接收到的流转换为内存session对象并添加到manager中;代码如图:

  • 相关阅读:
    云原生范式转变:您准备好了吗?
    CentOS 6.x 开机 自启动 脚本
    忠告 程序员 先思考再编程,累的时候不要写代码
    服务化架构组件清单
    代码自动修复
    选择塑造人生
    mariadb change password
    Spring 集成 Druid Monitor URL 配置转义问题(xml or properties)
    挣钱 vs. 花钱
    管理的要义
  • 原文地址:https://www.cnblogs.com/laoxia/p/7831667.html
Copyright © 2020-2023  润新知