分布式 - 集群环境下session相关问题
Session 共享方案
session 集中存储(redis等)。
具体过程如下:
新增Filter,拦截请求,包装HttpServletRequest(使用HttpServletRequestWrapper)改写getSession 方法,从第三方存储中获取session 数据(若没有则创建一个),返回自定义的HttpSession 实例。在http 返回response 时,提交session 信息到第三方存储中
考虑到session 中数据类似map 的结构,采用redis 中hash 存储session 数据比较合适。
SSO
通过一个ticket 进行串接各系统间的用户信息。
1、对于完全不同域名的系统,cookie 是无法跨域名共享的,因此sessionId 在页面端也无法共享
2、cas 方案,直接启用一个专业的用来登陆的域名(比如:cas.com)来供所有的系统的sessionId。
过程
- b.com 打开时,发现自己未登陆---->于是跳转到cas.com 去登陆
- cas.com 登陆页面被打开,用户输入帐户/密码登陆成功
- cas.com 登陆成功,种cookie 到cas.com 域名下----------->把sessionid 放入后台redis<ticket,sesssionid>—页面跳回b.com
- b.com 重新被打开,发现仍然是未登陆,但是有了一个ticket 值
- b.com 用ticket 值,到redis 里查到sessionid,并做session 同步------ >种cookie给自己,页面原地重跳
- b.com 打开自己页面,此时有了cookie,后台校验登陆状态,成功