shiro通过redis共享session实现多系统单点登陆,这个是很常见的配置,网上百度搭建教程一大堆。。
这次像往常一样搭建单点登录,但是由于是同一个业主单位,不同系统,因此需要实现不同系统的单点登陆。
然后按照以往配置,结果发现登陆失效了!一直以来都是用同一个系统做负载均衡,这次却报错:
read session error. settionId=XXXXXXXX-XXXX-XXXX
找了半天,最后发现是因为redis反序列化的问题!
因为第一个系统,包名是:com.xx.ucenter,而第二个是:com.xx.pp。
存入redis的时候,对象包名是:com.xx.ucenter.model,而反序列化的时候,包名变成了com.xx.pp.model。
这样就造成对象进行反序列化的时候出错了。。
解决办法有很多,比如将shiro登陆用户对象改成只记录ID:
return new SimpleAuthenticationInfo(admin, admin.getPassword(),this.getClass().getName());//放入shiro.调用CredentialsMatcher检验密码 改成 return new SimpleAuthenticationInfo(admin.getId(), admin.getPassword(),this.getClass().getName());//放入shiro.调用CredentialsMatcher检验密码
把admin对象,改成admin.getId();
这样就能解决问题了!