第一次写博客,与你们共勉.跨域
这里用到的原理其实很是简单,将cookie存在一个公共的站点的页面上就能够了,这里咱们管那个站点叫主站S.浏览器
先说说所谓的跨域缓存
环境1:a.xxx.com须要跟b.xxx.com实现跨域,这种比较简单,只须要设置cookie的域名关联域就能够了 cookie.Domain = "xxx.com",这样两个域名间的cookie就能够互相访问,实现跨域.cookie
环境2:a.aaa.com须要跟b.bbb.com实现跨域,这种不一样域名的状况下,想要实现就必须换种方式了.session
在这里我将引入第三者,s.sss.com这个站点,就是某个浏览器同时打开了这3个站点,咱们访问A站点,先判断自身是否登陆,若是session为空,就重定向到S站点,判断S站点上面是否有cookie,若是S站点上面也没有cookie,则由S站点重定向到A站点的登陆页.ui
这样咱们就实现了第一步,S站作的的就是隐藏在幕后,子站先判断本身是否存在session,若是不存在,就重定向到主站S上面去验证.线程
第二步,验证登陆信息合法性.这里我引入token(令牌),网上有不少资料,描述token的传递,工做方式是这样,A登陆成功,保存自身的session,重定向到S,S在本身站点保存一个session跟cookie,session保存token对象{tokenID,userName,startTime,endTime},cookie保存tokenID,tokenID是一个Guid,把token对象缓存在集合里面,另起一个线程,根据endTime(过时时间)来按期清理集合列表,重定向到A的时候再将tokenID传递过去,拿到tokenID后,进入验证环节,S站有提供一个接口,根据tokenID获取token对象,若是获取到对象,且没有失效,则tokenID合法,跳入index页面.状况2,A登陆,直接打开B,这时候B自身没有session,会主动请求主站,主站会返回cookieID(S站存在客户端的cookie),这个时候再走验证环节,若是经过,则B根据token对象建立自身的session,再跳入index.对象
在这里整个单点登陆就已经成功了,接下来附上流程图:blog
前面流程图,太丑了,这里补上一张,但愿有所帮助.token
源码:
说明:新建2个站点xxx-xxx.com(主站),yyy-yyy.com(子站),修改hosts文件,将这两个域名都指向127.0.0.1便可.