前言
今天本来想写一篇关于Session实现单点登录的文章,写一半的时候,发现自己仍然有些问题是很无法解释清楚的,所以只能自己解决之后再写。而顶级域名下的子域名实现Cookie共享是Session单点问题的一个案例,所以现在抽取出来了解一下。
许多公司都会拥有自己门户网站,如果我们在门户系统点击登录之后,那么我们在进入该公司的其他网站的时候,通常不会重复登录。为什么会这样呢?如果我们细心观察一下的话,我们会发现大多数他们都是拥有相同后缀(二级域名),比如百度,顶级域名是www.baidu.com,而该域名下面(这里是举例,并不一定是这个域名):
BBS网站是:bbs.baidu.com
博客网站是:blog.baidu.com
他们就属于相同的子级域名。
如果你没有那么多服务器,也没有域名,那么测试这种效果就需要一些特殊的操作:修改hosts文件(他的作用,这里就不说了) 我这里增加了两行 ,指向IP:127.0.0.1
127.0.0.1 sso.java.net
127.0.0.1 bbs.java.net
然后我们搭建两个项目,SSO和BBS,对应上面不同的域名,因为Cookie是以域名来进行隔离的,所以仅仅是端口号不同,不足以验证Cookie共享的效果。
我们在SSO的项目中增加下面的代码:
response.addCookie(token);
然后我们访问这个接口,如下图
我们可以看到token这个字段,和jsessionid(关于jsessionid本来是今天要聊的,因为中间测试出了一些自己很疑惑的问题,所以下次再说)。
然后我们访问bbs项目,这里我们单纯写一个接口就可以了:
@RequestMapping("testSession")
@ResponseBody
public boolean testSession() {
return true;
}
然后我们访问bbs.java.net:81的项目,可以如下图
我们可以看到他们token已经到bbs.java.net这个域名下了,且于sso.java.net是相同的值。目前这种方式在很多企业仍然被采用,因为cookie的共享,也就实现单点登录。