tomcat和shiro的关于session的问题

        tomcat重启之后,session不会失效,会将session保存在本地文件中。详见https://blog.csdn.net/li2054/article/details/78470072解决tomcat服务器重启之后session不失效的问题。
        所以在使用shiro的时候就出现了一个问题,调用的subject.isAuthenticated()方法的时候,会发现返回的是true。
项目是在subject.getSession的session中,把用户信息放在了session里。tomcat重启之后,session还在,subject也在,但是session里保存的数据已经没了。这样调用接口的时候校验登录是通过了,但是用户信息却没了。
    tomcat重启后,查询到的数据如下:
    subject:{"empty":false,"primaryPrincipal":"0400","realmNames":["com.hanshows.framework.security.AuthorizationRealmFilter_0"]}
    session:{"attributeKeys":["org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY","org.apache.shiro.web.session.HttpServletSession.HOST_SESSION_KEY","org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY"],"host":"0:0:0:0:0:0:0:1","id":"C2B35F297FA10BDE940F07D238920FBA","lastAccessTime":1554257621367,"startTimestamp":1554257542547,"timeout":3600000}
        此时发现,session的attributeKeys只有DefaultSubjectContext_AUTHENTICATED_SESSION_KEY,而我们登陆时set的key已经没有了。说明tomcat只是保存了session的基本信息,我们自定义setAttribute的值不会保存。
    解决方案
    在shiro校验用户登录时,应该校验三步:
        1.查看subject是否存在,
        2.查看session是否存在
            session.getAttribute(myKey)存的值是否存在
        3.查看subject.isAuthenticated()是否为true,是否登录
    PS:本项目是使用了session.setAttribute(myKey,UserInfo);的方式存储用户信息。如果用户默认使用的shiro自带的用户存储配置passportObjs.getPrincipals();则不会出现文章的问题。
    PS2:shiro的subject.getSession和mvc的httpServletRequest的getSession是同一个,都是HttpSession。详见https://my.oschina.net/thinwonton/blog/979118

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值