Tomcat源码八:Session
文章目录
对象模型
StandardService
StandardEngine
StandardHost
StandardContext
manager[StandardManager]
sessions[ConcurrentHashMap<String, Session>()]
session 属于 context,所以session作用域不跨 context, 即tomcat源码中的 sesion 不跨 examples、host-manager 等服务。
部署工程的时候,会在webapps下面生成 工程名字的文件夹,然后将工程部署到此文件夹下。
即:一个工程一个 context,各个工程之间的 session不通用。
通过查看对象模型会发现,context[0]和context[1] 中的 sesions 是不一样的。
对象模型
Adapter
Connector
Mapper
Hosts
Context
SessionManager
sessions[ConcurrentHashMap<String, Session>()]
首次SessionId的创建
JSESSIONID
这里表示为当前请求加入 Session管理
因此我们可以 指定每一个servlet,是否加入 session管理
比如上面的,第一个为 此jsp的请求不加入 session管理
第二个为 此servlet的请求不加入session管理
创建Session流程 RequestFacade.getSession()
创建Session Request.getSession()
StandardManager的createSessions 方法
StandardSessionIdGenerator的 generateSessionId方法
找到请求对应的Session
如下,首先是请求的不同
第一张图片是 浏览器第一次发送请求,tomcat 读取到的数据
第二张图片是 浏览器第二次发送请求,tomcat读取到的数据,比第一次多了Cookie
我们知道这些数据都回封装到 request 中
解析cookie信息 CoyoteAdapter.postParseRequest()
解析有两处,
一个是通过 url解析 cookie。(当cookie被 浏览器禁用时,会将cookie信息重写进url)
postParseRequest