1. 程式人生 > >Shiro——會話管理

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());
	}