回顾
上一篇文章中,实现了二级域名相同的网站的单点登录的效果。但是利用上篇文章的方式不能满足诸如:www.blog.com和www.news.com这样二级域名不同的网站的单点登录。
-
问题出在哪呢?
- 就是当访问一个网站把Cookie存放到某个地方之后,再访问另一个网站没有权限拿到这个Cookie。 为什么没有权限拿到呢?
- 因为Cookie生成的时候设置的Domain和Path的限制。这两个属性决定了在允许的域和资源路径范围内,当访问一个网站成功并保存了Cookie之后,再访问另一个网站的资源(属于允许的域和资源路径范围)的时候,浏览器会自动携带刚刚生成的Cookie并发送到服务端;否则,就不会把Cookie发送到服务端。
实现思路
如果还是利用Cookie+Filter我们怎么实现在二级域名不同的网站的单点登录效果呢?
——借助第三者,专门用来认证用户信息的一个“网站”。
1.比如我们访问www.blog.com的时候,我们把请求转给“第三者”,认证通过之后,在Cookie中保存用户信息,在Session中保存用户信息,将请求重定向给我们刚才的访问路径。
Cookie属于谁?——第三者。设置它的目的是:为了其他网站能得到用户信息。
在Session中保存用户信息的目的:当第三者认证通过再次将请求定向到原网站的时候,我们肯定会判断Session中是否为空。所以在重定向之前要给Session赋上值。
2.当我们访问www.news.com的时候,请求也会转给第三者,这个时候我们能拿到Cookie,就直接在Session中保存用户信息,并重定向到之前访问的路径。
所以Cookie是用来几个网站共享用户信息的,Session是用来每个网站自己内部判断能否登录的。
流程
CAS实现
上述其实就是CAS的基本过程,但是还有一些具体的细节和流程不在本篇文章说明。下面说说具体的实现。
我们只需要把CAS自带的服务端的Demo部署到server\ROOT路径下,把客户端的demo分别部署到blog\ROOT和news\ROOT下。
修改host文件
127.0.0.1 www.news.com
127.0.0.1 www.blog.com
127.0.0.1 www.server.com
修改server.xml文件
<Host name="www.news.com" appBase="news"></Host>
<Host name="www.blog.com" appBase="blog"></Host>
<Host name="www.server.com" appBase=