1. 程式人生 > >shiro的會話管理器SessionManager

shiro的會話管理器SessionManager

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>