Shiro 登录、退出、校验是否登录涉及到的Session和Cookie
前提
我们的使用的是DefaultWebSessionManager而不是ServletContainerSessionManager。这就意味着前者的session为Shiro的,后者的session为Tomcat的。
登录
DefaultWebSessionManager调用start()方法(在AbstractNativeSessionManager中)创建Session(SimpleSession),创建过程中会将Session放到介质(Redis)中,再调用onStart()方法将sessionId放入到浏览器的Cookie中。
我们已经拿到Session(SimpleSession)了可以将用户相关信息放到其中:session.setAttribute("userName", userName);,这个过程是放到了SimpleSession的一个Map属性中,同时更新介质中的SimpleSession。
退出
DefaultWebSessionManager调用stop(SessionKey key)方法(在AbstractNativeSessionManager中),SimpleSession设置停止时间戳,再调用onStop()方法设置最后访问时间戳并更新介质中的session,清除浏览器中关于session的Cookie。
校验是否登录
我们可以通过Session是否存在并且session中的用户信息是否存在来判断或者是Cookie是否存在或者是Subject.isAuthenticated()是否为false,有其一不成立就执行退出操作。