通过 HTTP Session 单点登录解决方案

817 阅读2分钟

概念

Session 代表服务器与浏览器的一次回话,这个过程是连续的也可以是时断时续的。

创建

Session 是在某个 server 端调用HttpServletRequest.getSession(true)时才被创建的,创建完成之后会将生成的 sessionId 存入responsecookie 域中。

请求响应过程

1.browser 发送 HttpRequest

2.tomcat 内核 Http11Processor 会从 HTTPRequest 中解析出 jsessionid (具体的解析过程为先从request的URL中解析,这是为了有的浏览器把cookie功能禁止后,将 UR L重写考虑的,如果解析不出来,再从 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 中的用户信息。