此文章只讲述原理, 实战解决方案请见另一篇<<SSO单点登录方案大全>>
一.什么是SSO?
单点登录(SingleSignOn), 即一处登录, 处处可用, 多用于分布式.
二.SSO有哪些类型?
①完全同域SSO
②同父域SSO
③ 跨域SSO
完全同域: 项目处在同一个域名, 但项目名不同.
同父域: 两个域名是多级域名, 但父级域名是一样的, 如: test1.cutedou.com 和 test2.cutedou.com
完全跨域: 处于完全不同的域名下
三.实现原理
访问目标资源时, 校验cookie, 有, 通过, 没有, 跳转到登录页, 经过统一登录接口, 登录成功, 服务器向浏览器写入cookie(服务器按自己的规则进行加密), 访问另一项目时 , 携带此cookie, 并校验有效性(即cookie通过自定义规则解密后是正确的)则通过(直接访问目标资源), 无效则跳转登录页.
cookie路径和跨域问题:
① 完全同域: 将cookie的路径设置为域名下的顶级路径/, 则在该域下的所有项目都携带此cookie.
② 同父域: cookie路径和完全同域情况下是一样的, 要新增的是保存cookie的域的位置, 既然父域是一样的, 那么就将cookie存入父域中, 即需要增加以下代码: cookie.setDomain(“.cutedou.com”), 注意需要以”.”开头. 即cookie的跨域, 这样相同父域名的子域名之间cookie是共享的.
③ 完全跨域: 在登录校验服务器完成登录校验时, 各自服务器返回自己的页面时, 在页面使用隐藏的iframe对所有服务器生成自身cookie的url进行调用(这个方法真笨, 等我百度出来好的),设置路径为/
四.问题
1.首次访问项目被拒绝, 跳转到登录页, 登录成功后, 应该跳转到哪个项目的首页呢?
答: 后台做登录校验时, 暂存一下客户端想访问的资源路径, 例如可以声明一个String类型的gotoUrl保存一下请求路径, 等到登陆成功, 重定向到gotoUrl.