tomcat重启之后,session不会失效,会将session保存在本地文件中。详见https://blog.youkuaiyun.com/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的问题
最新推荐文章于 2023-07-15 18:16:57 发布