Tomcat源码八:Session

对象模型

StandardService
	StandardEngine
		StandardHost
			StandardContext
				manager[StandardManager]
					sessions[ConcurrentHashMap<String, Session>()]

session 属于 context,所以session作用域不跨 context, 即tomcat源码中的 sesion 不跨 examples、host-manager 等服务。
部署工程的时候,会在webapps下面生成 工程名字的文件夹,然后将工程部署到此文件夹下。
即:一个工程一个 context,各个工程之间的 session不通用。
Tomcat源码八:Session
通过查看对象模型会发现,context[0]和context[1] 中的 sesions 是不一样的。
对象模型

	Adapter
		Connector
			Mapper
				Hosts
					Context
						SessionManager
							sessions[ConcurrentHashMap<String, Session>()]

首次SessionId的创建

JSESSIONID
Tomcat源码八:Session
这里表示为当前请求加入 Session管理
因此我们可以 指定每一个servlet,是否加入 session管理
Tomcat源码八:Session
比如上面的,第一个为 此jsp的请求不加入 session管理
第二个为 此servlet的请求不加入session管理

创建Session流程 RequestFacade.getSession()

Tomcat源码八:Session

创建Session Request.getSession()

Tomcat源码八:Session

StandardManager的createSessions 方法

Tomcat源码八:Session

StandardSessionIdGenerator的 generateSessionId方法

Tomcat源码八:Session
Tomcat源码八:Session

找到请求对应的Session

如下,首先是请求的不同
第一张图片是 浏览器第一次发送请求,tomcat 读取到的数据
第二张图片是 浏览器第二次发送请求,tomcat读取到的数据,比第一次多了Cookie

我们知道这些数据都回封装到 request 中
Tomcat源码八:Session
Tomcat源码八:Session

解析cookie信息 CoyoteAdapter.postParseRequest()

解析有两处,

一个是通过 url解析 cookie。(当cookie被 浏览器禁用时,会将cookie信息重写进url)

postParseRequest
Tomcat源码八:Session

另一个是从 Cookie中解析出 sessionId,找到服务器中的Cookie

Tomcat源码八:Session
Tomcat源码八:Session

之前在FormAuthenticator 处有个 Session

Tomcat源码八:Session