记一次Session跨域问题

背景:网站域名: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、如果有其他更好的解决方案,欢迎提出来!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值