基于二级域名下Cookie共享的SSO

网上已经有很多基于二级域名下Cookie共享的SSO的解决方案,对于原理大家可能都很了解,无非就是登录一个系统,产生一个令牌保存到Client端的cookie中,这个cookie是基于主域名的,然后再登录其它二级域名下的系统,就会直接读取主域名下的Cookie中的令牌,不要重新登录,方面用户使用多个系统。正好做到的项目中用到这个SSO登录验证,自己调试中遇到一些问题,以及解决方案,跟大家分享一下。

 

我的项目中有两个系统,域名分别是A.test.com,B.test.com(举例),test.com是一级域名,A.test.com&B.test.com是二级域名。任务是要做到在A登录后可以直接进入B系统,B系统会验证Cookie的令牌信息,正确的令牌才允许访问进入系统。A系统访问路径是http://A.test.com/x,B系统的访问路径是http://B.test.com/y。

 

好了,下面开始说明一下我的解决历程:

 

1.编码

 

  在A系统登录成功后写入Cookie

  ....

  Cookie cookie=new Cookie("token","令牌信息");//关于令牌名称可以约定一个,到时B系统会根据这个名称去获取令牌信息,信息令牌是加密处理r后的字符串,如何加密这里不再赘述。

 ....

  cookie.setDomain("test.com");//是基于一级域名的

  cookie.setMaxAge(1800);//设定Cookie的有效期

  response.addCookie(cookie);

  ....

 

2.测试检查

通过http://A.test.com/x访问后,Cookie目录出现一个[email protected][1]的Cookie文件,查看IE缓存目录,有一条名为x/的记录,internet地址为Cookie:[email protected]/x,系统缓存目录地址C:/Documents and Settings/administrator/Local Settings/Temporary Internet Files,我的是XP系统,Cookie目录地址C:/Documents and Settings/administrator/Cookies。

 

通过http://B.test.com/y访问后,根据读取不到这个Cookie,为了测试方便,我在Y/下的index.jsp中,写了一段代码,就是往Cookie中写一些信息,看它会保存到哪个cookie文件中,测试后发现在Cookie目录会生成一个[email protected][2]的文件,然后再IE缓存有一条名y/的记录,internet地址为Cookie:[email protected]/y,反复访问刷新后,A和B的Cookie总会不一样,文件名分别在[1],[2]之间变换,反正就不会是一个文件。

 

3.反复分析

 

比较Cookie和缓存中文件,发现就是x&y不一至,于是动手把A下的x系统和B下的y系统的webapp name都改成统一的,再试,成功了!两个系统可以合并到一个Cookie中了。

 

4.总结

要想在两个二级域名下共享Cookie,第一,设定的cookie要设定setDomain(一级域名);第二,访问的两个系统的webapp name一至。

如果两个系统直接是基于域名跑的,http://A.test.com,http://B.test.com,就没有后面那个修改webapp name的问题了,只要确保写Cookie时,setDomain(一级域名),这里是"test.com"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章