背景:网站域名:aa.abc.com,客户有需求,需要定制专属域名,如:kehu.abc.com。
项目介绍:前后端未分离的项目,登录授权是使用的shiro做的,页面是使用JSP写的。登录成功后,会将获取到的token写入cookie,接口有拦截器处理,shiro是未登录态时,会尝试使用cookie来登录,实现单点登录。
方案:申请专属域名,使用Nginx映射到网站域名上;后台服务也做了处理,如果登录用户判断有专属域名,则直接重定向到专属域名上,否则使用网站域名。逻辑很简单,流程如下,其他跳转页面的接口同理。
问题:当专属域名和网站域名,来回使用专属域名客户账号和普通账号登录时,发生了用户信息混乱的问题,排查下来是session跨域导致信息不同步。
具体复现步骤(账号:普通账号A,专属账号B):
解决思路:
1、修改cookie中sessionId的名称和域
当时想着是sessionId对应的域是完整的域名,想改成可适配二级域名的域,如csdn这样,就可以解决跨域的问题了
尝试修改shiro的域名和域配置,没有生效,sessionId应该不是shiro生成的,看源码shiro生成的sessionId名称应该是 JSESSIONID
而我们网站上生成的sessionId名称是SESSION,也不像是tomcat生成的,应该是spring-session生成的,具体源码没去跟踪,问题需要赶紧修复,就没去确认session由谁生成的了,有知道的小伙伴可以告知一下。
2、使用redis记录登录态
1. 登录成功后,使用redis记录登录态;2.退出时,清理登录态;3.拦截器拦截请求,如果shiro判断为登录态,则再去redis判断是否登录态,不是,则shiro做退出处理(清理服务端的session信息),继续尝试使用token登录; 如果redis也是登录态,则继续下一过滤器处理。这种情况下保证了多域名下,同一账号登录态保持一致。
3、如果有其他更好的解决方案,欢迎提出来!