tomcat和shiro的关于session的问题

Posted wodediqizhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于tomcat和shiro的关于session的问题的主要内容,如果未能解决你的问题,请参考以下文章

ShiroApache Shiro Session管理

Shiro+Redis??????tomcat??????session??????

session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理

session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理

解决org.apache.shiro.session.UnknownSessionException: There is no session with id的问题

Shiro-Session