概念
Session代表服务器与浏览器的一次回话,这个过程是连续的也可以是时断时续的。
创建
Session 是在某个 server 端调用HttpServletRequest.getSession(true)时才被创建的,创建完成之后会将生成的 sessionId 存入response 的 cookie 域中。
请求响应过程
1.
browser发送HttpRequest;
2.
tomcat内核Http11Processor会从HTTPRequest中解析出jsessionid(具体的解析过程为先从request的URL中解析,这是为了有的浏览器把cookie功能禁止后,将URL重写考虑的,如果解析不出来,再从cookie中解析相应的jsessionid),解析完后封装成一个request对象(当然还有其他的HTTPHeader);
3.
servlet中获取session。其过程是根据刚才解析得到的jsessionid(如果有的话),从session池(session maps)中获取相应的session对象;这个地方有个逻辑,就是如果jsessionid为空的话 (或者没有其对应的session对象;或者有session对象,但此对象已经过期超时),可以选择创建一个session,或者不创建;
4.如果创建新
session,则将session放入session池中,同时将与其相对应的jsessionid写入cookie通过HttpResponseHeader的方式发送给browser,然后重复第一步。
HTTP请求,Cookie的使用过程
1、server通过HTTP Response中的"Set-Cookie: header"把cookie发送给client
2、client把cookie通过HTTP Request 中的“Cookie: header”发送给server
3、每次HTTP请求,Cookie都会被发送。
Tip:
http请求发送cookies的条件:
1、本地已经缓存有cookies
2、根据请求的URL来匹配cookies的domain、path属性,如果都符合才会发送。
举个例子:访问www.baidu.com时,就不发送www.qq.com的cookies.
单点登录
1.系统A 和 系统B 两个系统设置相同的二级域名(在hosts中进行配置)。
2.系统A 携带账号以及密码向 系统B 发送请求。
3.系统B 在服务器中创建相应的 Session 并将用户信息放入其中。最后将 JSessionId 返回给 系统A 作为 Cookie 保存在客户端,至此 系统A 每次向 系统B 发送请求时都会在 HTTPRequestHeader 放入 JSessionId 。
4.系统B 在拦截所有请求时通过 HTTPRequestHeader 验证 JSessionId 对应的 Session 中的用户信息。