shiro2.5_session管理

使用Sessions

幾乎與所有其他在Shiro 中的東西一樣, 你可以通過與當(dāng)前執(zhí)行的Subject 交互來獲取當(dāng)前Session :

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

subject.getSession() 方法是調(diào)用 currentUser.getSubject(true)的快捷方式

對(duì)于那些熟悉 HttpServletRequest API 的, Subject.getSession(boolean create) 方法與 HttpServletRequest.getSession(boolean create) 方法有著異曲同工之效.

  • 如果該Subject 已經(jīng)擁有一個(gè)Session, 則boolean 參數(shù)被忽略且Session 被立即返回
  • 如果該Subject 還沒有一個(gè)Session 且create 參數(shù)為true, 則創(chuàng)建一個(gè)新的會(huì)話并返回該會(huì)話
  • 如果該Subject 還沒有一個(gè)Session 且create 參數(shù)為false, 則不會(huì)創(chuàng)建新的會(huì)話且返回null

任意應(yīng)用

getSession 要求能夠在任何應(yīng)用程序工作, 甚至是非 Web 應(yīng)用程序

當(dāng)開發(fā)框架代碼來確保一個(gè) Session 沒有被創(chuàng)建是沒有必要的時(shí)候, subject.getSession(false) 可以起到很好的作用. 當(dāng)你獲取了一個(gè) Subject 的 Session 后, 你可以用它來做許多事情, 像設(shè)置或取得 attribute, 設(shè)置其超時(shí)時(shí)間等.

SessionManager

SessionManager, 名如其意, 在應(yīng)用程序中為所有的 subject 管理Session —— 創(chuàng)建, 刪除, inactivity(失效)及驗(yàn)證, 等等. 如同其他在Shiro 中的核心結(jié)構(gòu)組件一樣, SessionManager 也是一個(gè)由 SecurityManager 維護(hù)的頂級(jí)組件.

SecurityManger 默認(rèn)使用開箱即用的DefaultSessionManager. DefaultSessionManager 的實(shí)現(xiàn)提供一個(gè)應(yīng)用程序所需的所有企業(yè)級(jí)會(huì)話管理, 如 Session 驗(yàn)證, session自動(dòng)刪除, 等等. 這可以在任何應(yīng)用程序中使用.

像其他被 SecurityManager 管理的組件一樣, SessionManager 可以通過 JavaBean 風(fēng)格的 getter/setter 方法在所有Shiro 默認(rèn) SecurityManager 實(shí)現(xiàn)上獲取或設(shè)置值( getSessionManager()/setSessionManager() ).

如果在 shiro.ini 文件中配置SessionManager :

[main]
sessionManager = com.foo.my.SessionManagerImplementation
securityManager.sessionManager = $sessionManager

但從頭開始創(chuàng)建一個(gè) SessionManager 是一個(gè)復(fù)雜的任務(wù)且是大多數(shù)人不想親自做的事情. Shiro 的開箱即用的SessionManager 實(shí)現(xiàn)是高度可定制的和可配置的, 并滿足大多數(shù)的需要. 本文檔的其余部分假定你將使用 Shiro 的默認(rèn) SessionManager 實(shí)現(xiàn), 當(dāng)覆蓋配置選項(xiàng)時(shí). 但請(qǐng)注意, 你基本上可以創(chuàng)建或插入任何你想要的東西.

Session 超時(shí)

通常情況下Shiro 的 SessionManager 實(shí)現(xiàn)默認(rèn)是 30 分鐘會(huì)話超時(shí). 也就是說, 如果任何 Session 創(chuàng)建后閑置(未被使用, 它的 lastAccessedTime未被更新) 的時(shí)間超過了 30 分鐘, 那么該 Session 就被認(rèn)為是過期的, 且不允許再被使用.

你可以設(shè)置 SessionManager 默認(rèn)實(shí)現(xiàn)的 globalSessionTimeout 屬性來為所有的會(huì)話定義默認(rèn)的超時(shí)時(shí)間. 例如, 如果你想超時(shí)時(shí)間是一個(gè)小時(shí)而不是 30 分鐘:

[main]
# 3,600,000 毫秒 = 1 小時(shí)
securityManager.sessionManager.globalSessionTimeout = 3600000
___________           .___         _____  _________ .__                   __                
\_   _____/ ____    __| _/   _____/ ____\ \_   ___ \|  |__ _____  _______/  |_  ___________ 
 |    __)_ /    \  / __ |   /  _ \   __\  /    \  \/|  |  \\__  \ \____ \   __\/ __ \_  __ \
 |        \   |  \/ /_/ |  (  <_> )  |    \     \___|   Y  \/ __ \|  |_> >  | \  ___/|  | \/
/_______  /___|  /\____ |   \____/|__|     \______  /___|  (____  /   __/|__|  \___  >__|   
        \/     \/      \/                         \/     \/     \/|__|             \/       

End of Chapter

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容