shiro的會話管理器SessionManager
阿新 • • 發佈:2018-12-29
SessionManager會話管理器管理著應用中所有Subject的會話的建立、維護、刪除、失效、驗證等工作。
public interface SessionManager {
Session start(SessionContext context); //啟動會話
Session getSession(SessionKey key) throws SessionException; //根據會話Key獲取會話
}
它的實現繼承類
用於Web環境的WebSessionManager又提供瞭如下介面
boolean isServletContainerSessions();//是否使用Servlet容器的會話
ValidatingSessionManager 用於驗資並過期會話介面
void validateSessions();//驗證所有會話是否過期
Shiro提供了三個預設實現:
DefaultSessionManager:DefaultSecurityManager使用的預設實現,用於JavaSE環境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的預設實現,用於Web環境,其直接使用Servlet容器的會話;
DefaultWebSessionManager:用於Web環境的實現,可以替代ServletContainerSessionManager,自己維護著會話,直接廢棄了Servlet容器的會話管理。
設定會話的全域性過期時間(毫秒為單位),預設30分鐘
public void setGlobalSessionTimeout(long globalSessionTimeout)
預設情況下globalSessionTimeout將應用給所有Session。可以單獨設定每個Session的timeout屬性來為每個Session設定其超時時間。
另外如果使用ServletContainerSessionManager進行會話管理,Session的超時依賴於底層Servlet容器的超時時間,可以在web.xml中配置其會話的超時時間(分鐘為單位):
<session-config> <session-timeout>30</session-timeout> </session-config>
在Servlet容器中,預設使用JSESSIONID Cookie維護會話,且會話預設是跟容器繫結的;在某些情況下可能需要使用自己的會話機制,此時我們可以使用DefaultWebSessionManager來維護會話:
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!-- 設定Cookie名字, 預設為: JSESSIONID 問題: 與SERVLET容器名衝突, 如JETTY, TOMCAT 等預設JSESSIONID,
當跳出SHIRO SERVLET時如ERROR-PAGE容器會為JSESSIONID重新分配值導致登入會話丟失! -->
<property name="name" value="freeway.session.id"/>
<!-- 設定Cookie的域名,預設空,即當前訪問的域名 -->
<property name="domain" value="taobao.com"/>
<!-- 設定Cookie的路徑,預設空,即儲存在域名根下 -->
<property name="path" value=""/>
<!-- 設定Cookie的過期時間,秒為單位,預設-1表示關閉瀏覽器時過期Cookie -->
<property name="maxAge" value="1800"/>
<!-- 如果設定為true,則客戶端不會暴露給客戶端指令碼程式碼,使用HttpOnly cookie有助於減少某些型別的跨站點指令碼攻擊;此特性需要實現了Servlet 2.5 MR6及以上版本的規範的Servlet容器支援 -->
<property name="httpOnly" value="false"/>
</bean>
下面來看SessionManager的配置
<!-- 會話管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- session的失效時長,單位毫秒 -->
<property name="globalSessionTimeout" value="180000"/>
<!-- 刪除失效的session -->
<property name="deleteInvalidSessions" value="true"/>
<!-- 啟用Cookie -->
<property name="sessionIdCookieEnabled" value="true"/>
<!-- 配置Cookie -->
<property name="sessionIdCookie" ref="sessionIdCookie"/>
<!-- 設定建立會話工廠 -->
<property name="sessionFactory" ref="sessionFactory"/>
<!-- 設定SessionDAO用於會話的CRUD,即DAO(Data Access Object)模式實現 -->
<property name="sessionDAO" ref="sessionDAO"/>
<!-- 設定會話監聽 -->
<property name="sessionListeners" ref="sessionListener"/>
<!-- 設定排程時間間隔,單位毫秒,預設就是1小時 -->
<property name="sessionValidationInterval" value="3000000"/>
<!-- 是否開啟會話驗證器,預設是開啟的 -->
<property name="sessionValidationSchedulerEnabled" value="true"/>
<!-- 設定會話驗證排程器 -->
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
</bean>