欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shiro會(huì)話管理示例代碼

 更新時(shí)間:2017年09月19日 15:51:31   作者:動(dòng)力節(jié)點(diǎn)  
Shiro提供了完整的企業(yè)級(jí)會(huì)話管理功能,不依賴于底層容器(如web容器tomcat),直接使用Shiro的會(huì)話管理可以直接替換如Web容器的會(huì)話管理

Shiro提供了完整的企業(yè)級(jí)會(huì)話管理功能,不依賴于底層容器(如web容器tomcat),不管JavaSE還是JavaEE環(huán)境都可以使用,提供了會(huì)話管理、會(huì)話事件監(jiān)聽(tīng)、會(huì)話存儲(chǔ)/持久化、容器無(wú)關(guān)的集群、失效/過(guò)期支持、對(duì)Web的透明支持、SSO單點(diǎn)登錄的支持等特性。即直接使用Shiro的會(huì)話管理可以直接替換如Web容器的會(huì)話管理。 

會(huì)話

所謂會(huì)話,即用戶訪問(wèn)應(yīng)用時(shí)保持的連接關(guān)系,在多次交互中應(yīng)用能夠識(shí)別出當(dāng)前訪問(wèn)的用戶是誰(shuí),且可以在多次交互中保存一些數(shù)據(jù)。如訪問(wèn)一些網(wǎng)站時(shí)登錄成功后,網(wǎng)站可以記住用戶,且在退出之前都可以識(shí)別當(dāng)前用戶是誰(shuí)。 

Shiro的會(huì)話支持不僅可以在普通的JavaSE應(yīng)用中使用,也可以在JavaEE應(yīng)用中使用,如web應(yīng)用。且使用方式是一致的。 

Java代碼  

login("classpath:shiro.ini", "zhang", "123"); 
Subject subject = SecurityUtils.getSubject(); 
Session session = subject.getSession(); 

登錄成功后使用Subject.getSession()即可獲取會(huì)話;其等價(jià)于Subject.getSession(true),即如果當(dāng)前沒(méi)有創(chuàng)建Session對(duì)象會(huì)創(chuàng)建一個(gè);另外Subject.getSession(false),如果當(dāng)前沒(méi)有創(chuàng)建Session則返回null(不過(guò)默認(rèn)情況下如果啟用會(huì)話存儲(chǔ)功能的話在創(chuàng)建Subject時(shí)會(huì)主動(dòng)創(chuàng)建一個(gè)Session)。

Java代碼  

session.getId(); 

獲取當(dāng)前會(huì)話的唯一標(biāo)識(shí)。 

Java代碼  

session.getHost();

 獲取當(dāng)前Subject的主機(jī)地址,該地址是通過(guò)HostAuthenticationToken.getHost()提供的。  

Java代碼  

session.getTimeout(); 
session.setTimeout(毫秒); 

獲取/設(shè)置當(dāng)前Session的過(guò)期時(shí)間;如果不設(shè)置默認(rèn)是會(huì)話管理器的全局過(guò)期時(shí)間。  

Java代碼  

session.getStartTimestamp(); 
session.getLastAccessTime(); 

獲取會(huì)話的啟動(dòng)時(shí)間及最后訪問(wèn)時(shí)間;如果是JavaSE應(yīng)用需要自己定期調(diào)用session.touch()去更新最后訪問(wèn)時(shí)間;如果是Web應(yīng)用,每次進(jìn)入ShiroFilter都會(huì)自動(dòng)調(diào)用session.touch()來(lái)更新最后訪問(wèn)時(shí)間。     

Java代碼  

session.touch(); 
session.stop(); 

更新會(huì)話最后訪問(wèn)時(shí)間及銷毀會(huì)話;當(dāng)Subject.logout()時(shí)會(huì)自動(dòng)調(diào)用stop方法來(lái)銷毀會(huì)話。如果在web中,調(diào)用javax.servlet.http.HttpSession. invalidate()也會(huì)自動(dòng)調(diào)用Shiro Session.stop方法進(jìn)行銷毀Shiro的會(huì)話。  

Java代碼  

session.setAttribute("key", "123"); 
Assert.assertEquals("123", session.getAttribute("key")); 
session.removeAttribute("key"); 

設(shè)置/獲取/刪除會(huì)話屬性;在整個(gè)會(huì)話范圍內(nèi)都可以對(duì)這些屬性進(jìn)行操作。  

Shiro提供的會(huì)話可以用于JavaSE/JavaEE環(huán)境,不依賴于任何底層容器,可以獨(dú)立使用,是完整的會(huì)話模塊。 

會(huì)話管理器

會(huì)話管理器管理著應(yīng)用中所有Subject的會(huì)話的創(chuàng)建、維護(hù)、刪除、失效、驗(yàn)證等工作。是Shiro的核心組件,頂層組件SecurityManager直接繼承了SessionManager,且提供了SessionsSecurityManager實(shí)現(xiàn)直接把會(huì)話管理委托給相應(yīng)的SessionManager,DefaultSecurityManager及
DefaultWebSecurityManager默認(rèn)SecurityManager都繼承了SessionsSecurityManager。 

SecurityManager提供了如下接口: 

Java代碼  

Session start(SessionContext context); //啟動(dòng)會(huì)話 
Session getSession(SessionKey key) throws SessionException; //根據(jù)會(huì)話Key獲取會(huì)話

另外用于Web環(huán)境的WebSessionManager又提供了如下接口: 

Java代碼  

boolean isServletContainerSessions();//是否使用Servlet容器的會(huì)話 

Shiro還提供了ValidatingSessionManager用于驗(yàn)資并過(guò)期會(huì)話: 

Java代碼  

void validateSessions();//驗(yàn)證所有會(huì)話是否過(guò)期 

Shiro提供了三個(gè)默認(rèn)實(shí)現(xiàn):

DefaultSessionManager:DefaultSecurityManager使用的默認(rèn)實(shí)現(xiàn),用于JavaSE環(huán)境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默認(rèn)實(shí)現(xiàn),用于Web環(huán)境,其直接使用Servlet容器的會(huì)話;

DefaultWebSessionManager:用于Web環(huán)境的實(shí)現(xiàn),可以替代ServletContainerSessionManager,自己維護(hù)著會(huì)話,直接廢棄了Servlet容器的會(huì)話管理。

替換SecurityManager默認(rèn)的SessionManager可以在ini中配置(shiro.ini):

Java代碼  

[main] 
sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager 
securityManager.sessionManager=$sessionManager 

Web環(huán)境下的ini配置(shiro-web.ini):

<!--EndFragment-->

Java代碼  

[main] 
sessionManager=org.apache.shiro.web.session.mgt.ServletContainerSessionManager 
securityManager.sessionManager=$sessionManager 

另外可以設(shè)置會(huì)話的全局過(guò)期時(shí)間(毫秒為單位),默認(rèn)30分鐘:

Java代碼  

sessionManager. globalSessionTimeout=1800000 

默認(rèn)情況下globalSessionTimeout將應(yīng)用給所有Session??梢詥为?dú)設(shè)置每個(gè)Session的timeout屬性來(lái)為每個(gè)Session設(shè)置其超時(shí)時(shí)間。

另外如果使用ServletContainerSessionManager進(jìn)行會(huì)話管理,Session的超時(shí)依賴于底層Servlet容器的超時(shí)時(shí)間,可以在web.xml中配置其會(huì)話的超時(shí)時(shí)間(分鐘為單位): 

Java代碼  

<session-config> 
 <session-timeout>30</session-timeout> 
</session-config> 

在Servlet容器中,默認(rèn)使用JSESSIONID Cookie維護(hù)會(huì)話,且會(huì)話默認(rèn)是跟容器綁定的;在某些情況下可能需要使用自己的會(huì)話機(jī)制,此時(shí)我們可以使用DefaultWebSessionManager來(lái)維護(hù)會(huì)話:

Java代碼  

sessionIdCookie=org.apache.shiro.web.servlet.SimpleCookie 
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
sessionIdCookie.name=sid 
#sessionIdCookie.domain=sishuok.com 
#sessionIdCookie.path= 
sessionIdCookie.maxAge=1800 
sessionIdCookie.httpOnly=true 
sessionManager.sessionIdCookie=$sessionIdCookie 
sessionManager.sessionIdCookieEnabled=true 
.securityManager.sessionManager=$sessionManager 

sessionIdCookie是sessionManager創(chuàng)建會(huì)話Cookie的模板:

sessionIdCookie.name:設(shè)置Cookie名字,默認(rèn)為JSESSIONID;

sessionIdCookie.domain:設(shè)置Cookie的域名,默認(rèn)空,即當(dāng)前訪問(wèn)的域名;

sessionIdCookie.path:設(shè)置Cookie的路徑,默認(rèn)空,即存儲(chǔ)在域名根下;

sessionIdCookie.maxAge:設(shè)置Cookie的過(guò)期時(shí)間,秒為單位,默認(rèn)-1表示關(guān)閉瀏覽器時(shí)過(guò)期Cookie;

sessionIdCookie.httpOnly:如果設(shè)置為true,則客戶端不會(huì)暴露給客戶端腳本代碼,使用HttpOnly cookie有助于減少某些類型的跨站點(diǎn)腳本攻擊;此特性需要實(shí)現(xiàn)了Servlet 2.5 MR6及以上版本的規(guī)范的Servlet容器支持;

sessionManager.sessionIdCookieEnabled:是否啟用/禁用Session Id Cookie,默認(rèn)是啟用的;如果禁用后將不會(huì)設(shè)置Session Id Cookie,即默認(rèn)使用了Servlet容器的JSESSIONID,且通過(guò)URL重寫(URL中的“;JSESSIONID=id”部分)保存Session Id。

 另外我們可以如“sessionManager. sessionIdCookie.name=sid”這種方式操作Cookie模板。 

會(huì)話監(jiān)聽(tīng)器

會(huì)話監(jiān)聽(tīng)器用于監(jiān)聽(tīng)會(huì)話創(chuàng)建、過(guò)期及停止事件: 

Java代碼  

public class MySessionListener1 implements SessionListener { 
 @Override 
 public void onStart(Session session) {//會(huì)話創(chuàng)建時(shí)觸發(fā) 
  System.out.println("會(huì)話創(chuàng)建:" + session.getId()); 
 } 
 @Override 
 public void onExpiration(Session session) {//會(huì)話過(guò)期時(shí)觸發(fā) 
  System.out.println("會(huì)話過(guò)期:" + session.getId()); 
 } 
 @Override 
 public void onStop(Session session) {//退出/會(huì)話過(guò)期時(shí)觸發(fā) 
  System.out.println("會(huì)話停止:" + session.getId()); 
 } 
} 

如果只想監(jiān)聽(tīng)某一個(gè)事件,可以繼承SessionListenerAdapter實(shí)現(xiàn):

Java代碼  

public class MySessionListener2 extends SessionListenerAdapter { 
 @Override 
 public void onStart(Session session) { 
  System.out.println("會(huì)話創(chuàng)建:" + session.getId()); 
 } 
} 

在shiro-web.ini配置文件中可以進(jìn)行如下配置設(shè)置會(huì)話監(jiān)聽(tīng)器:

Java代碼 

sessionListener1=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener1 
sessionListener2=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener2 
sessionManager.sessionListeners=$sessionListener1,$sessionListener2 

會(huì)話存儲(chǔ)/持久化 

Shiro提供SessionDAO用于會(huì)話的CRUD,即DAO(Data Access Object)模式實(shí)現(xiàn):

Java代碼 

//如DefaultSessionManager在創(chuàng)建完session后會(huì)調(diào)用該方法;如保存到關(guān)系數(shù)據(jù)庫(kù)/文件系統(tǒng)/NoSQL數(shù)據(jù)庫(kù);即可以實(shí)現(xiàn)會(huì)話的持久化;返回會(huì)話ID;主要此處返回的ID.equals(session.getId()); 
Serializable create(Session session); 
//根據(jù)會(huì)話ID獲取會(huì)話 
Session readSession(Serializable sessionId) throws UnknownSessionException; 
//更新會(huì)話;如更新會(huì)話最后訪問(wèn)時(shí)間/停止會(huì)話/設(shè)置超時(shí)時(shí)間/設(shè)置移除屬性等會(huì)調(diào)用 
void update(Session session) throws UnknownSessionException; 
//刪除會(huì)話;當(dāng)會(huì)話過(guò)期/會(huì)話停止(如用戶退出時(shí))會(huì)調(diào)用 
void delete(Session session); 
//獲取當(dāng)前所有活躍用戶,如果用戶量多此方法影響性能 
Collection<Session> getActiveSessions(); 

Shiro內(nèi)嵌了如下SessionDAO實(shí)現(xiàn):

AbstractSessionDAO提供了SessionDAO的基礎(chǔ)實(shí)現(xiàn),如生成會(huì)話ID等;CachingSessionDAO提供了對(duì)開(kāi)發(fā)者透明的會(huì)話緩存的功能,只需要設(shè)置相應(yīng)的CacheManager即可;MemorySessionDAO直接在內(nèi)存中進(jìn)行會(huì)話維護(hù);而EnterpriseCacheSessionDAO提供了緩存功能的會(huì)話維護(hù),默認(rèn)情況下使用MapCache實(shí)現(xiàn),內(nèi)部使用ConcurrentHashMap保存緩存的會(huì)話。

可以通過(guò)如下配置設(shè)置SessionDAO:

Java代碼  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
sessionManager.sessionDAO=$sessionDAO 

Shiro提供了使用Ehcache進(jìn)行會(huì)話存儲(chǔ),Ehcache可以配合TerraCotta實(shí)現(xiàn)容器無(wú)關(guān)的分布式集群。

首先在pom.xml里添加如下依賴:

Java代碼  

<dependency> 
 <groupId>org.apache.shiro</groupId> 
 <artifactId>shiro-ehcache</artifactId> 
 <version>1.2.2</version> 
</dependency> 

接著配置shiro-web.ini文件:   

Java代碼  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
sessionDAO. activeSessionsCacheName=shiro-activeSessionCache 
sessionManager.sessionDAO=$sessionDAO 
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager 
cacheManager.cacheManagerConfigFile=classpath:ehcache.xml 
securityManager.cacheManager = $cacheManager 

sessionDAO. activeSessionsCacheName:設(shè)置Session緩存名字,默認(rèn)就是shiro-activeSessionCache;

cacheManager:緩存管理器,用于管理緩存的,此處使用Ehcache實(shí)現(xiàn);

cacheManager.cacheManagerConfigFile:設(shè)置ehcache緩存的配置文件;

securityManager.cacheManager:設(shè)置SecurityManager的cacheManager,會(huì)自動(dòng)設(shè)置實(shí)現(xiàn)了CacheManagerAware接口的相應(yīng)對(duì)象,如SessionDAO的cacheManager;

然后配置ehcache.xml:

Java代碼  

<cache name="shiro-activeSessionCache" 
  maxEntriesLocalHeap="10000" 
  overflowToDisk="false" 
  eternal="false" 
  diskPersistent="false" 
  timeToLiveSeconds="0" 
  timeToIdleSeconds="0" 
  statistics="true"/> 

Cache的名字為shiro-activeSessionCache,即設(shè)置的sessionDAO的activeSessionsCacheName屬性值。 

另外可以通過(guò)如下ini配置設(shè)置會(huì)話ID生成器:

Java代碼  

sessionIdGenerator=org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator 
sessionDAO.sessionIdGenerator=$sessionIdGenerator 

用于生成會(huì)話ID,默認(rèn)就是JavaUuidSessionIdGenerator,使用java.util.UUID生成。 

如果自定義實(shí)現(xiàn)SessionDAO,繼承CachingSessionDAO即可:

Java代碼  

public class MySessionDAO extends CachingSessionDAO { 
 private JdbcTemplate jdbcTemplate = JdbcTemplateUtils.jdbcTemplate(); 
  protected Serializable doCreate(Session session) { 
  Serializable sessionId = generateSessionId(session); 
  assignSessionId(session, sessionId); 
  String sql = "insert into sessions(id, session) values(?,?)"; 
  jdbcTemplate.update(sql, sessionId, SerializableUtils.serialize(session)); 
  return session.getId(); 
 } 
protected void doUpdate(Session session) { 
 if(session instanceof ValidatingSession && !((ValidatingSession)session).isValid()) { 
  return; //如果會(huì)話過(guò)期/停止 沒(méi)必要再更新了 
 } 
  String sql = "update sessions set session=? where id=?"; 
  jdbcTemplate.update(sql, SerializableUtils.serialize(session), session.getId()); 
 } 
 protected void doDelete(Session session) { 
  String sql = "delete from sessions where id=?"; 
  jdbcTemplate.update(sql, session.getId()); 
 } 
 protected Session doReadSession(Serializable sessionId) { 
  String sql = "select session from sessions where id=?"; 
  List<String> sessionStrList = jdbcTemplate.queryForList(sql, String.class, sessionId); 
  if(sessionStrList.size() == 0) return null; 
  return SerializableUtils.deserialize(sessionStrList.get(0)); 
 } 
} 

doCreate/doUpdate/doDelete/doReadSession分別代表創(chuàng)建/修改/刪除/讀取會(huì)話;此處通過(guò)把會(huì)話序列化后存儲(chǔ)到數(shù)據(jù)庫(kù)實(shí)現(xiàn);接著在shiro-web.ini中配置:

Java代碼  

sessionDAO=com.github.zhangkaitao.shiro.chapter10.session.dao.MySessionDAO 

其他設(shè)置和之前一樣,因?yàn)槔^承了CachingSessionDAO;所有在讀取時(shí)會(huì)先查緩存中是否存在,如果找不到才到數(shù)據(jù)庫(kù)中查找。 

會(huì)話驗(yàn)證

Shiro提供了會(huì)話驗(yàn)證調(diào)度器,用于定期的驗(yàn)證會(huì)話是否已過(guò)期,如果過(guò)期將停止會(huì)話;出于性能考慮,一般情況下都是獲取會(huì)話時(shí)來(lái)驗(yàn)證會(huì)話是否過(guò)期并停止會(huì)話的;但是如在web環(huán)境中,如果用戶不主動(dòng)退出是不知道會(huì)話是否過(guò)期的,因此需要定期的檢測(cè)會(huì)話是否過(guò)期,Shiro提供了會(huì)話驗(yàn)證調(diào)度器SessionValidationScheduler來(lái)做這件事情。

可以通過(guò)如下ini配置開(kāi)啟會(huì)話驗(yàn)證:   

Java代碼  

sessionValidationScheduler=org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler 
sessionValidationScheduler.interval = 3600000 
sessionValidationScheduler.sessionManager=$sessionManager 
sessionManager.globalSessionTimeout=1800000 
sessionManager.sessionValidationSchedulerEnabled=true
sessionManager.sessionValidationScheduler=$sessionValidationScheduler 

sessionValidationScheduler:會(huì)話驗(yàn)證調(diào)度器,sessionManager默認(rèn)就是使用ExecutorServiceSessionValidationScheduler,其使用JDK的ScheduledExecutorService進(jìn)行定期調(diào)度并驗(yàn)證會(huì)話是否過(guò)期;

sessionValidationScheduler.interval:設(shè)置調(diào)度時(shí)間間隔,單位毫秒,默認(rèn)就是1小時(shí);

sessionValidationScheduler.sessionManager:設(shè)置會(huì)話驗(yàn)證調(diào)度器進(jìn)行會(huì)話驗(yàn)證時(shí)的會(huì)話管理器;

sessionManager.globalSessionTimeout:設(shè)置全局會(huì)話超時(shí)時(shí)間,默認(rèn)30分鐘,即如果30分鐘內(nèi)沒(méi)有訪問(wèn)會(huì)話將過(guò)期;

sessionManager.sessionValidationSchedulerEnabled:是否開(kāi)啟會(huì)話驗(yàn)證器,默認(rèn)是開(kāi)啟的;

sessionManager.sessionValidationScheduler:設(shè)置會(huì)話驗(yàn)證調(diào)度器,默認(rèn)就是使用ExecutorServiceSessionValidationScheduler。 

Shiro也提供了使用Quartz會(huì)話驗(yàn)證調(diào)度器:

Java代碼  

sessionValidationScheduler=org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler 
sessionValidationScheduler.sessionValidationInterval = 3600000 
sessionValidationScheduler.sessionManager=$sessionManager 

使用時(shí)需要導(dǎo)入shiro-quartz依賴:

Java代碼  

<dependency> 
  <groupId>org.apache.shiro</groupId> 
  <artifactId>shiro-quartz</artifactId> 
  <version>1.2.2</version> 
</dependency> 

如上會(huì)話驗(yàn)證調(diào)度器實(shí)現(xiàn)都是直接調(diào)用AbstractValidatingSessionManager 的validateSessions方法進(jìn)行驗(yàn)證,其直接調(diào)用SessionDAO的getActiveSessions方法獲取所有會(huì)話進(jìn)行驗(yàn)證,如果會(huì)話比較多,會(huì)影響性能;可以考慮如分頁(yè)獲取會(huì)話并進(jìn)行驗(yàn)證,如com.github.zhangkaitao.shiro.chapter10.session.scheduler.MySessionValidationScheduler:

Java代碼  

//分頁(yè)獲取會(huì)話并驗(yàn)證 
String sql = "select session from sessions limit ?,?"; 
int start = 0; //起始記錄 
int size = 20; //每頁(yè)大小 
List<String> sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); 
while(sessionList.size() > 0) { 
 for(String sessionStr : sessionList) { 
 try { 
  Session session = SerializableUtils.deserialize(sessionStr); 
  Method validateMethod = 
  ReflectionUtils.findMethod(AbstractValidatingSessionManager.class, 
   "validate", Session.class, SessionKey.class); 
  validateMethod.setAccessible(true); 
  ReflectionUtils.invokeMethod(validateMethod, 
  sessionManager, session, new DefaultSessionKey(session.getId())); 
 } catch (Exception e) { 
  //ignore 
 } 
 } 
 start = start + size; 
 sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); 
} 

其直接改造自ExecutorServiceSessionValidationScheduler,如上代碼是驗(yàn)證的核心代碼,可以根據(jù)自己的需求改造此驗(yàn)證調(diào)度器器;ini的配置和之前的類似。

如果在會(huì)話過(guò)期時(shí)不想刪除過(guò)期的會(huì)話,可以通過(guò)如下ini配置進(jìn)行設(shè)置:

Java代碼  

sessionManager.deleteInvalidSessions=false 

默認(rèn)是開(kāi)啟的,在會(huì)話過(guò)期后會(huì)調(diào)用SessionDAO的delete方法刪除會(huì)話:如會(huì)話時(shí)持久化存儲(chǔ)的,可以調(diào)用此方法進(jìn)行刪除。 

如果是在獲取會(huì)話時(shí)驗(yàn)證了會(huì)話已過(guò)期,將拋出InvalidSessionException;因此需要捕獲這個(gè)異常并跳轉(zhuǎn)到相應(yīng)的頁(yè)面告訴用戶會(huì)話已過(guò)期,讓其重新登錄,如可以在web.xml配置相應(yīng)的錯(cuò)誤頁(yè)面:

Java代碼  

<error-page> 
 <exception-type>org.apache.shiro.session.InvalidSessionException</exception-type> 
 <location>/invalidSession.jsp</location> 
</error-page> 

sessionFactory

sessionFactory是創(chuàng)建會(huì)話的工廠,根據(jù)相應(yīng)的Subject上下文信息來(lái)創(chuàng)建會(huì)話;默認(rèn)提供了SimpleSessionFactory用來(lái)創(chuàng)建SimpleSession會(huì)話。

首先自定義一個(gè)Session:

Java代碼  

public class OnlineSession extends SimpleSession { 
 public static enum OnlineStatus { 
  on_line("在線"), hidden("隱身"), force_logout("強(qiáng)制退出"); 
  private final String info; 
  private OnlineStatus(String info) { 
   this.info = info; 
  } 
  public String getInfo() { 
   return info; 
  } 
 } 
 private String userAgent; //用戶瀏覽器類型 
 private OnlineStatus status = OnlineStatus.on_line; //在線狀態(tài) 
 private String systemHost; //用戶登錄時(shí)系統(tǒng)IP 
 //省略其他 
} 

OnlineSession用于保存當(dāng)前登錄用戶的在線狀態(tài),支持如離線等狀態(tài)的控制。

接著自定義SessionFactory:

Java代碼  

public class OnlineSessionFactory implements SessionFactory { 
 
 @Override 
 public Session createSession(SessionContext initData) { 
  OnlineSession session = new OnlineSession(); 
  if (initData != null && initData instanceof WebSessionContext) { 
   WebSessionContext sessionContext = (WebSessionContext) initData; 
   HttpServletRequest request = (HttpServletRequest) sessionContext.getServletRequest(); 
   if (request != null) { 
    session.setHost(IpUtils.getIpAddr(request)); 
    session.setUserAgent(request.getHeader("User-Agent")); 
    session.setSystemHost(request.getLocalAddr() + ":" + request.getLocalPort()); 
   } 
  } 
  return session; 
 } 
} 

根據(jù)會(huì)話上下文創(chuàng)建相應(yīng)的OnlineSession。 

最后在shiro-web.ini配置文件中配置:

Java代碼  

sessionFactory=org.apache.shiro.session.mgt.OnlineSessionFactory 
sessionManager.sessionFactory=$sessionFactory 

 總結(jié)

以上所述是小編給大家介紹的shiro會(huì)話管理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • linux線程切換和進(jìn)程切換的方法

    linux線程切換和進(jìn)程切換的方法

    下面小編就為大家?guī)?lái)一篇linux線程切換和進(jìn)程切換的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 使用?DataAnt?監(jiān)控?Apache?APISIX的原理解析

    使用?DataAnt?監(jiān)控?Apache?APISIX的原理解析

    Apache?APISIX?是一個(gè)開(kāi)源的云原生?API?網(wǎng)關(guān),作為?API?網(wǎng)關(guān),它兼具動(dòng)態(tài)、實(shí)時(shí)、高性能等特點(diǎn),提供了負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測(cè)性等豐富的流量管理功能,這篇文章主要介紹了如何使用?DataAnt?監(jiān)控?Apache?APISIX,需要的朋友可以參考下
    2022-06-06
  • Linux下如何搭建兩個(gè)tomcat服務(wù)

    Linux下如何搭建兩個(gè)tomcat服務(wù)

    本篇文章主要介紹了Linux下如何搭建兩個(gè)tomcat服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • CentOS 7下用firewall-cmd控制端口與端口轉(zhuǎn)發(fā)詳解

    CentOS 7下用firewall-cmd控制端口與端口轉(zhuǎn)發(fā)詳解

    這篇文章主要給大家介紹了在CentOS 7下用firewall-cmd控制端口與端口轉(zhuǎn)發(fā)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下來(lái)來(lái)一起看看吧。
    2017-05-05
  • Ubuntu常用指令及用法詳解

    Ubuntu常用指令及用法詳解

    本文重點(diǎn)給大家介紹Ubuntu常用指令及用法,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-06-06
  • 解決Linux中修改/etc/profile文件寫錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題

    解決Linux中修改/etc/profile文件寫錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題

    這篇文章主要介紹了解決Linux中修改/etc/profile文件寫錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解Apache配置多個(gè)監(jiān)聽(tīng)端口和不同的網(wǎng)站目錄

    詳解Apache配置多個(gè)監(jiān)聽(tīng)端口和不同的網(wǎng)站目錄

    這篇文章主要介紹了詳解Apache配置多個(gè)監(jiān)聽(tīng)端口和不同的網(wǎng)站目錄的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-10-10
  • Apache POI簡(jiǎn)介及應(yīng)用場(chǎng)景

    Apache POI簡(jiǎn)介及應(yīng)用場(chǎng)景

    Apache POI 是一個(gè)處理Miscrosoft Office各種文件格式的開(kāi)源項(xiàng)目,我們可以使用POI在Java程序中對(duì)Miscrosoft Office各種文件進(jìn)行讀寫操作,本文給大家介紹Apache POI簡(jiǎn)介,感興趣的朋友一起看看吧
    2023-11-11
  • Apache和Tomcat有什么區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Apache和Tomcat有什么區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Apache 和 Tomcat 都是web網(wǎng)絡(luò)服務(wù)器,兩者既有聯(lián)系又有區(qū)別。下面通過(guò)本文給大家介紹Apache和Tomcat的區(qū)別,感興趣的朋友一起看看吧
    2017-08-08
  • Linux下MongoDB的安裝和配置教程

    Linux下MongoDB的安裝和配置教程

    這篇文章主要介紹了Linux下MongoDB的安裝和配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論