shiro多项目跳转用户身份失效问题排查

shiro多项目跳转用户身份失效问题排查

1. 身份失效问题

  最近在项目中遇到过一个问题,统一登录系统中有各个子系统的模块,可点击子系统模块进行跳转,如下图所示:
在这里插入图片描述
  如上图,当用户点击子系统B新窗口打开时,实现跳转成功,当再回到原统一登录系统页面,再点击子系统A或者子系统B,却报出用户失效类似的问题。

2. 问题原因分析

  经过浏览器F12排查接口请求头,发现一个问题,由于我们这次部署的多个项目,对外都同属一个外网ip下,对于前端来说F12中的Application中存储的cookie名,都为JESSIONID,为shiro默认的cookie名。
  显然是JESSIONID值被顶替了,如下图:
在这里插入图片描述
  下图是具体的前端浏览器在操作时的截图操作:
在这里插入图片描述
  如上图,初次访问时,已经有一个JESSIONID,对应的值为这个。如果后端不对cookie名进行设置,默认都会为JESSIONID。当系统正常使用,每一个请求都会在request_header里携带cookie值,传递给后台,后台通过设置的cookie名,即JESSIONID里取出cookie,验证session身份。
在这里插入图片描述
  当多个项目在同一个域下(前端对外访问只要在同一个ip下,都算作一个域),如果不进行设置,统一登录登录成功后,本来有自己的JESSIONID,当跳转子系统,恰巧子系统和统一登录同属一个域,并且子系统也是默认的JESSIONID值,就会用子系统的JESSIONID值冲掉前者的JESSIONID值,导致切换回统一登录点击另一个子系统时,会显示身份失效等问题。
  统一登录再次操作时,会使用子系统新的JESSIONID值发起请求,到统一登录服务,此时拿着子系统的钥匙去统一登录找身份,肯定失败。
  当然发生这种情况的时候,前提是统一登录和子系统访问地址同处一个ip下,如果不是这种情况,一般没有这个问题,但是实际部署的时候,发生这种情况还是很多的。

3. 问题解决办法

  问题找到了,解决办法就好找了,就是对统一登录和子系统的对应的cookie名,各自起一个,让它们不再冲突即可。
  对于shiro框架里,可以对cookie名进行设置,如下图所示,对应的SimpleCookie simpleCookie = new SimpleCookie("ynzl_cookie"),这里起名为ynzl_cookie即可。

 @Bean(name = {"sessionIdCookie"})
    public SimpleCookie getSessionIdCookie() {
        //sessionid名称,每个系统都必须不一致
        SimpleCookie simpleCookie = new SimpleCookie("ynzl_cookie");
        simpleCookie.setMaxAge(-1);
        simpleCookie.setHttpOnly(true);
        return simpleCookie;
}

  总之,用户失效的问题,基本有以下几种原因:

  1. 用户身份压根在第一次登录时,就没存储成功,锁都没了,钥匙再对也白搭了。
  2. cookie被重置了,就像本文的问题一样,钥匙被替换了,拧断手也是开不开的。
  3. 时效性,cookiesession的时间配置,也应该保证一定时间可用,如果太短,很容易就失效了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁壮成长的凌大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值