提示:目前了解到的,此方式只能实现父级域名一致的子域名间单点登录,如用户登录了a.xx.com,再访问b.xx.com/xxx.do,则不需要再登录。
单点登录(个人理解,如有不足,请补充):由多个服务组成的一组服务,登录其中一个服务后,访问其他服务的受限资源,不再需要登录
实现方式(个人理解,如有不足,请补充):
1、共享session:本文基于此,只有让不同的tomcat共用一个session对象,才真正实现了session共享,从而实现单点
2、放弃session:引入认证中心,每次访问受限资源,携带token
3、只是单纯共享登录状态:重写ValveBase ,见http://blog.csdn.net/luka2008/article/details/38385703/
准备工作:
1、新建web工程(或者已经使用session的既有工程),基于maven
2、准备redis实例
3、修改pom,加入如下dependency
redis.clients
jedis
2.5.2
org.springframework.data
spring-data-redis
1.7.1.RELEASE
org.springframework.session
spring-session-data-redis
1.2.0.RELEASE
org.apache.commons
commons-pool2
2.2
5、修改web.xml,加入如下片段(我的工程是基于spring mvc、再集成spring-seesion)
注意:
springSessionRepositoryFilter必须放在所有filter的最前面
contextConfigLocation
classpath:spring.xml,classpath:spring-session.xml
springSessionRepositoryFilter
org.springframework.web.filter.DelegatingFilterProxy
springSessionRepositoryFilter
/*
REQUEST
ERROR
6、修改本地hosts文件,将127.0.0.1分别绑定a.xx.com、b.xx.com
注意,此处的父级域名xx.com要和spring-seesion.xml中,defaultCookieSerializer的domainName属性值配成一个,访问时,url也要用配置的对应项访问
情况1:domainName配成.xx.com,则验证时,url输入a.xx.com
情况2:domainName配成127.0.0.1,则验证时,url输入127.0.0.1
情况3:domainName配成localhost,则验证时,url输入localhost
这一点好多文章都没有写,这和session的创建和匹配机制有关,只有严格匹配了域名、path、访问路径才不会重复创建session,详细了解参考:跨域(二级域)session共享
7、验证
访问a.xx.com并登录,然后访问b.xx.com/xxx.do,则可正常访问。
总结:
优点:对原有系统代码零侵入,只需修改配置,便可实现单点登录
不足:不能实现跨顶级域名(设计之初,就没有往这个方向考虑大约)
刚开始研究没多久,如有不妥之处,请多多拍砖。
能够配置成功,参考了如下几篇文章,多谢多谢。
Spring-session & redis 子域名共享session:http://blog.csdn.net/beflyabot/article/details/51449315
SPRING SESSION实现单点登录 :http://blog.csdn.net/moxies8090/article/details/53355244
跨域(二级域)session共享:http://blog.csdn.net/luka2008/article/details/38385703/