前提
我們的使用的是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,有其一不成立就執行退出操作。