tomcat session

tomcat session

相关类

org.apache.catalina.Manager

StandardManager

SessionIdGenerator

Manager实现类

Manager 用于管理 session.默认实现是 StandardManager,基类 ManagerBase.

Manager
    ClusterManager (org.apache.catalina.ha)
        ClusterManagerBase (org.apache.catalina.ha.session)
            BackupManager (org.apache.catalina.ha.session)
            DeltaManager (org.apache.catalina.ha.session)
    ManagerBase (org.apache.catalina.session)
        PersistentManagerBase (org.apache.catalina.session)
            PersistentManager (org.apache.catalina.session)
        ClusterManagerBase (org.apache.catalina.ha.session)
            BackupManager (org.apache.catalina.ha.session)
            DeltaManager (org.apache.catalina.ha.session)
        StandardManager (org.apache.catalina.session)

StandardManager的实现

通过 SessionIdGenerator 为每个会话生成,分配一个唯一标识.若集群环境,可配置后面加上tomcat集群标识.

过期会话处理,在 backgroundProcess() 中.它不断循环判断所有会话中是否有过期的,一旦过期则移除.

StandContext 停止时,将该 web 应用的所有 session 持久化到磁盘中,文件名 SESSIONS.ser.

当 web 应用启动时,会加载这些持久化的会话,加载完成后,SESSIONS.ser 将会被删除.

session获取和创建

- request.getSession(true)获取session对象,true表示没有则创建session
    - RequestFacade.getSession()
        - connector.Request.getSession()
            - doGetSession()
            - 1.获取StandContext
            - 2.若session不为null,则isValid()校验session是否失效,校验通过直接返回session
            - 3.若上面没有获取到session,则尝试根据requestedSessionId通过manager.findSession()去查找session
            - 4.manager.createSession(sessionId)创建session
                - 1.超过最大允许创建的session数量则报错
                - 2.createEmptySession()创建standardSession对象并设置session超时时间等参数
                - 3.generateSessionId()通过sessionIdGenerator生成sessionId设置到session.id属性中
            - 5.基于刚刚创建的session创建一个新的cookie,其实就是向响应头中添加Set-Cookie: JSESSIONID=AA97BC74DD24D2423386C81DB98CED8B; Path=/books; HttpOnly

在这里插入图片描述

在这里插入图片描述

- session.setAttribute(KEY, username)设置session属性
    - StandardSessionFacade.setAttribute()
        - StandSession.setAttribute()
            - 保存key-value到protected ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<String, Object>();里

session清理

在这里插入图片描述

- ConatinerBase$ContainerBackgroundProcessor.run()
    - StandContext.backgroundProcess()
        - 父类 ContainerBase 逻辑,判断 Manager 不为 null,调用 manager.backgroundProcess().
            - manager.backgroundProcess()控制默认60s才执行一次清理.调用ManagerBase.processExpires()
                - ManagerBase.processExpires()中
                - 1.获取所有sessions
                - 2.遍历每一个session,通过isValid()判断是否失效并处理失效
                    - isValid()里通过当前时间戳,thisAccessedTime,maxInactiveInterval决定是否需要session失效,若失效调用expire()处理
                        - expire()会调用相关sessionListeners,并从ManagerBase里sessions这个map中移除session

session thisAccessedTime 更新时机.
在 StandardSession.thisAccessedTime 属性上 添加 field watchpoint
创建session 时默认 thisAccessedTime 值 就是 creationTime
在这里插入图片描述

  1. tomcat 在处理完请求之后,会对 Request 对象进行回收,并且会回收 Session,此时会更新 thisAccessedTime

  2. request.getSession()时,若创建 session,会在 StandardSession.setCreationTime()里更新 thisAccessedTime.若是获取session,会在 StandardSession.access() 里更新 thisAccessedTime 为 当前时间.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值