使用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