请求时不带JSESSIONID导致shiro总是鉴权失败

框架

Spring + Shiro

问题详细描述

项目是通过ajax去进行登录校验,当检验成功后在前端页面使用window.location = "main"跳转到主页。主页相关的Controller中使用了@RequiresAuthentication(使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。),在某些条件下,登录步骤正确完成(在后端中代码获取session并打印,确实已经分配了有效的sessionId),跳转到main被shiro干掉报鉴权失败。并且这个问题只有在chrome下才有出现,在IE8上无法复现。

问题定位

  1. 清理chrome缓存后可以正确进入main;
  2. 进一步发现,清理chrome的cookies就能让程序正确进入;
  3. 于是得到问题与cookie相关的结论,并且cookie中只有一个JESSIONID的参数与登录有关;
  4. 通过使用fiddler抓包发现,正常的情况下在登录请求完成之后,会有一步set-cookie的操作,该操作给浏览器上的cookie设置了JSESSIONID,并且之后所有的请求都会带上拥有该JESSIONID的cookie;但是在不正常的情况下,虽然登录请求之后也set-cookie了,但是在跳转到主页的请求中带上的cookie中没有JESSIONID;
  5. 所以认为,如果可以让main请求时带上拥有JSESSIONID的cookie,那么就能成功进入main。

问题解决

再次在浏览器中观察cookie的内容,发现无论是正常的情况还是异常的情况,cookie中总是拥有JESSIONID,不同的是正常的情况下cookie中的JSESSIONID是shiro产生的,而异常的情况下JSESSIONID是tomcat产生的。这时想起来,当时引入shiro的时候使用了sessionManager,shiro就会使用自己产生的sessionId而不是tomcat产生的,并且没有重新定义shiro的session的名字,会不会是shiro与tomcat的冲突了而导致这个问题呢?于是立马在项目中引入shiro关于cookie的配置,果然再也无法复现这个问题了。至此,问题得到完美解决。

总结

在使用shiro框架的时候,如果使用了sessionManager那么对于cookie的配置也需要配置一下,避免一些没必要的冲突而导致的奇怪问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值