Shiro——會話管理
Shiro的會話實際上跟HTTPSession是一致的,都是表示客戶端和伺服器的一次會話。
一、Shiro的會話特點
不依賴於底層容器(如web容器tomcat),不管JavaSE還是JavaEE環境都可以使用,提供了會話管理、會話事件監聽、會話儲存/持久化、容器無關的叢集、失效/過期支援、對Web的透明支援、SSO單點登入的支援等特性。
二、會話相關的API
1、Subject.getSession():即可獲取會話;其等價於Subject.getSession(true),即如果當前沒有建立Session物件就會建立一個;Subject.getSession(false),如果當前沒有建立Session則返回null。
2、session.getId():獲取當前會話的唯一標識
3、session.getHost():獲取當前Subject的主機地址
4、session.getTimeout() & session.setTimeout(毫秒):獲取/設定當前session的過期時間
5、session.getStartTimestamp() & session.getLastAccessTime():獲取會話的啟動時間及最後訪問時間。
6、session.touch() & session.stop():更新會話的最後訪問時間及銷燬時間;當Subject.logout()時會自動呼叫stop()方法來銷燬會話。如果在web中,呼叫HttpSession.invalidate()也會自動呼叫Shiro Session.stop方法進行銷燬Shiro的會話。
7、session.setAttribute(key,val) & session.getAttribute(key) & session.removeAttribute(key):設定/獲取/刪除會話屬性,在整個會話範圍內都可以對這些屬性進行操作。
三、會話監聽器
監聽會話的建立,停止和過期事件。
SessionListener
onStart(Session):void
onStop(Session):void
onExpiration(Session):void
四、Shiro的Session的使用
在Controller建立一個session並給session賦值
@RequestMapping(value = "test")
public String test(HttpSession session){
session.setAttribute("testSession", "測試Shiro的session");
shiroService.test();
return "redirect:/list.jsp";
}
在service中可以獲取到session:
@RequiresRoles({"admin"})
public void test(){
Session session = SecurityUtils.getSubject().getSession();
System.out.println("Shiro Session:" + session.getAttribute("testSession"));
System.out.println("ShiroService測試許可權:" + new Date());
}