-
使用redis+token方式
-
共享session方式
- 使用现成的框架spring-session
-
如果共用一个顶级域名
- sessionid被种在顶级域名中
- 后台通过redis共享session的值,当请求来的时候,去redis中查询session
- 当请求到达服务器,服务器获取到cookie中的sessionid,然后通过sessionid到redis中获取session对象
- 判断是否登录,主要判断session对象中是否有user信息。
- 为了request.getsession时,自动能拿到redis中共享的session,我们需要重写request的getsession方法(使用HttpServletRequestWrapper包装原request)
-
使用不同的域名(cas方案)
- 直接启用一个专门用来做登录的域名来提供所有系统登录
- 当访问业务系统a时候,发现未登录,那么就跳转到cas系统登录
- 用户输入用户名密码登录成功
- 将cookie种到cas.com下,将sessionId放入到redis,key为ticket,页面调回到a系统
- a系统显示仍未登录,这时候拿着ticket去redis中获取sessionid,并做session同步,将cookie种到自己域名下,原地跳转重新判断是否登录
- 此时,a系统显示有了cookie,登录成功。
- 如果跳转cas系统时就是登录的,那么直接放回ticket即可。
- cas优化方案
第一步:用户访问a。过滤器判断用户是否登录,没有登录,则重定向(302)到网站b
第二步:重定向到b,输入用户名密码。b将用户登录的信息记录到服务器的session中。
第三步:b给浏览器发送一个特殊的凭证,浏览器将凭证交给a,a则拿着浏览器交给他的凭证去b验证凭证是否有效,从而判断用户是否登录成功
第四步:登录成功,浏览器与网站之间进行正常的访问。