tomcat session
相关类
1 2 3 4 5
| org.apache.catalina.Manager
StandardManager
SessionIdGenerator
|
Manager实现类
Manager 用于管理 session.默认实现是 StandardManager,基类 ManagerBase.
1 2 3 4 5 6 7 8 9 10 11 12
| 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获取和创建
1 2 3 4 5 6 7 8 9 10 11 12
| - 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
|
1 2 3 4
| - session.setAttribute(KEY, username)设置session属性 - StandardSessionFacade.setAttribute() - StandSession.setAttribute() - 保存key-value到protected ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<String, Object>();里
|
session清理
1 2 3 4 5 6 7 8 9
| - 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
tomcat 在处理完请求之后,会对 Request 对象进行回收,并且会回收 Session,此时会更新 thisAccessedTime
request.getSession()时,若创建 session,会在 StandardSession.setCreationTime()里更新 thisAccessedTime.若是获取session,会在 StandardSession.access() 里更新 thisAccessedTime 为 当前时间.