Tomcat 的 sessionId 是何时创建、由谁创建的

1. 看看代码

首先看 javax.servlet.http.HttpServletRequestWrapper.getSession(boolean) 方法,这是 RequestWrapper 的一个方法,它先获取了真正的 Request,然后调用 Request 的 getSession 方法

Tomcat 的 sessionId 是何时创建、由谁创建的

 之后进入 org.apache.catalina.connector.RequestFacade,这也是 Request 的一个包裹类,它会调用真正的 Request 方法 getSession()

Tomcat 的 sessionId 是何时创建、由谁创建的

进入真正的 Request

Tomcat 的 sessionId 是何时创建、由谁创建的

 doGetSession 方法如下,程序会走到 manager.createSession()

Tomcat 的 sessionId 是何时创建、由谁创建的

 如果传入的 sessionId 为 null,则会创建一个 sessionId

Tomcat 的 sessionId 是何时创建、由谁创建的

下面进入 generateSessionId(),该方法其实会调用 sessionIdGenerator 来创建一个 sessionId,为了防止 sessionId 重复,还做了一层 do-while 循环进行判断。

Tomcat 的 sessionId 是何时创建、由谁创建的

上面我们还可以看到,sessions 应该就是 Tomcat 存储 session 的对象,这个对象其实是一个 Map

Tomcat 的 sessionId 是何时创建、由谁创建的

下面看看 sessionId 生成器做了什么,它传入一个 jvmRoute 的参数

Tomcat 的 sessionId 是何时创建、由谁创建的

这里我们可以看到,其实就是 org.apache.catalina.util.StandardSessionIdGenerator 来进行 sessionId 的生成的

Tomcat 的 sessionId 是何时创建、由谁创建的

再说一个问题:刚才提到的 sessions 是用来存储 Tomcat 的所有 session 的,那么 session 是在哪添加的呢?回到org.apache.catalina.session.ManagerBase.createSession(String) 

Tomcat 的 sessionId 是何时创建、由谁创建的

Session 是个接口,真正的实现类是 org.apache.catalina.session.StandardSession

Tomcat 的 sessionId 是何时创建、由谁创建的

 有这么一句代码,调用了 manager 的 add 方法

Tomcat 的 sessionId 是何时创建、由谁创建的

 manager 的 add 方法本质上就是给 Map 对象 put 了一对 key-value

Tomcat 的 sessionId 是何时创建、由谁创建的

2. 总结

ManagerBase 是所有 session 管理工具类的抽象基类。

Tomcat 的 sessionId 是何时创建、由谁创建的

StandardManager 是 Tomcat 默认的 session 管理实现类,它会将 session 的信息存储到内存中(本质上就是 Map 对象)。

PersistentManagerBase 是持久化存储 session 的抽象基类,PersistentManager 是一个实现类,应该意义不大。