Shiro的Session管理

概述和配置使用html

n概述java

  Shiro提供安全框架界獨一無二的東西:一個完整的企業級Session 解決方案,能夠爲任意的應用提供session支持,包括web和非web應用,而且無需部署你的應用程序到Web 容器或使用EJB容器。python

n基本使用web

  能夠經過與當前執行的Subject 交互來獲取Session:數據庫

 Subject currentUser = SecurityUtils.getSubject();  
 Session session = currentUser.getSession();
 session.setAttribute("someKey", someValue);

n關於SessionManagerapache

  SessionManager是用來管理Session的組件,包括:建立,刪除,inactivity(失效)及驗證,等等。SessionManager 也是一個由SecurityManager 維護的頂級組件。緩存

  shiro提供了默認的SessionManager實現,通常沒有必要自定義這個。安全

n設置Sessioin的過時時間session

  Shiro 的SessionManager 實現默認是30 分鐘會話超時。框架

  你能夠設置SessionManager 默認實現的globalSessionTimeout 屬性來爲全部的會話定義默認的超時時間。例如,

[main]
# 3,600,000 milliseconds = 1 hour
securityManager.sessionManager.globalSessionTimeout = 3600000

nSessioin的事件監聽

      你能夠實現SessionListener 接口(或擴展易用的SessionListenerAdapter)並與相應的會話操做做出反應。 配置示例:

[main]
aSessionListener = com.foo.my.SessionListener
anotherSessionListener = com.foo.my.OtherSessionListener
securityManager.sessionManager.sessionListeners = $aSessionListener, $anotherSessionListener

 

SessionDAO

n概述

  每當一個會話被建立或更新時,它的數據須要持久化到一個存儲位置以便它可以被稍後的應用程序訪問,實現這個功能的組件就是SessionDAO。

  你可以實現該接口來與你想要的任何數據存儲進行通訊。這意味着你的會話數據能夠駐留在內存中,文件系統,關係數據庫或NoSQL 的數據存儲,或其餘任何你須要的位置。

n基本配置
  SessionDAO是做爲一個屬性配置在默認的SessionManager 實例上

[main]
sessionDAO = com.foo.my.SessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO

 這種SessionDAO主要在本地應用中起做用。

n基於EHCache的SessionDAO,基本配置以下:

[main]
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager

nShiro提供了默認的EHCache的配置xml,若是你要配置本身的EHCache.xml,須要注意如下幾點:

1:overflowToDisk=「true」 - 這確保當你溢出進程內存時,會話不丟失且可以被序列化到磁盤上。

2: eternal=「true」 - 確保緩存項(Session 實例)永不過時或被緩存自動清除。這是頗有必要的,由於Shiro 基於計劃過程完成本身的驗證。若是咱們關掉這項,緩存將會在Shiro 不知道的狀況下清掃這些Sessions,這可能引發麻煩。

3:若是你想使用一個不一樣的名字而不是默認的,你能夠在EnterpriseCacheSessionDAO 上配置名字,例如:sessionDAO.activeSessionsCacheName = myname

  只要確保在ehcahe.xml 中有一項與這個名字匹配

 

Web應用中的Session

       n在web應用上,默認使用的是容器的會話,若是你想基於Web 應用程序啓用SessionDAO 來自定義會話存儲或會話羣集,你將不得不首先配置一個本地的Web 會話管理器。例如:

[main]
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
# Configure a SessionDAO and then set it:
securityManager.sessionManager.sessionDAO = $sessionDAO

      n在web應用上,若是想要在每個請求的基礎上啓用或禁用會話的建立,能夠在配置中的[urls] 裏面,爲相應的url設置一個noSessionCreation過濾器,以下:

[urls]
/rest/** = noSessionCreation, authcBasic

 自定義SessionDAO

       n在某些場景中,咱們須要管理用戶的Session信息,好比把Session信息放到數據庫中,這樣就能夠記錄一個操做日誌,或是統計在線人員等等。

       n自定義SessionDAO也很是簡單,一般是繼承AbstractSessionDAO,實現對Session數據的CRUD便可,簡單示例以下:

public class MySessionDAO extends AbstractSessionDAO{
private Map<Serializable,Session> map = new HashMap<Serializable,Session>();
  public void update(Session session) throws UnknownSessionException {
  System.out.println("now update session");
  map.put(session.getId(),session);
  }
  public void delete(Session session) {
  System.out.println("now delete session"); 
  map.remove(session.getId());
  }
  public Collection<Session> getActiveSessions() {
  System.out.println("now getActiveSessions session");
  return map.values();
  }
 
  protected Serializable doCreate(Session session) {
  System.out.println("now doCreate session");
  Serializable sessionId = generateSessionId(session);
      assignSessionId(session, sessionId);
      map.put(sessionId, session);
   
     return sessionId;
  }
  protected Session doReadSession(Serializable sessionId) {
  System.out.println("now doReadSession session");
  return map.get(sessionId);
  }
}

n基本的配置示例:

sessionDAO = cn.javass.hello.MySessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO

 私塾在線 原創,轉載請註明 http://sishuok.com/forum/blogPost/list/0/7458.html

相關文章
相關標籤/搜索