一、概述
tomcat 识别用户,依靠的 cookie 和 session。cookie 保存在客户端,name 是 "JSESSIONID",values 是 sessionId。session 保存在 tomcat 的 StandardManager 对象中。
二、JSESSIONID 的生成与响应头
当在 servlet 中使用,request.getSession() 时,会得到 session,这个request 是 RequestFacade,会执行 Request 的 getSession(true)
1、查看 request 的成员变量 session 是否有值,如果有,直接返回 session
2、如果 request 的成员变量 session 为空,查看 request 的成员变量 requestedSessionId 是否有值,如果有从 StandardManager 获得 session (StandardManager 有 Map<String, Session> sessions
,保存的 sessionId 与 session)
3、查看 request 的 session 为 null,requestedSessionId 也为 null,使用 StandardManager 创建 StandardSesison,并放到 StandardManager 的 sessions 中;创建 cookie,cookie 的 name 是 "JSESSIONID",值是 sessionId,把 cookie 放到响应头,例:addHeader("Set-Cookie", "JSESSIONID=E5C491ACB2326D22649FCFCC994500CF; Path=/servlet_hello; HttpOnly")
三、JSESSIONID 的作用与请求头
当请求到达 tomcat,会分析请求,然后执行 filter 和 servlet
1、执行 CoyoteAdapter 的 service(request, response) 方法
2、执行 CoyoteAdapter 的 postParseRequest(req, request, res, response) 分析请求,把 name 是 JSESSIONID 的 cookie 的值,赋给 Request 的 requestedSessionId 成员变量
3、执行 AuthenticatorBase 的 invoke(request, response) 方法,request.getSessionInternal(false),
根据 requestedSessionId 获得 从 StandardManager 获得 Session,把 Session 赋值给 Request。
4、 ApplicationFilterChain 执行 doFilter(request, response) 方法,执行Filter,然后执行 Servlet