1. 程式人生 > >spring mvc+Mybatis整合shiro 第三章 SessionManager

spring mvc+Mybatis整合shiro 第三章 SessionManager

sessionManager是shiro用來獲取對應session的一個管理類。他的作用是代替預設的方法來管理會話。

public class MySessionManager extends DefaultWebSessionManager {
	private String domain = PropertiesUtils.getValueByProperty("domain","/config/shiro.properties");
	/**
	 * 此主方法可以接收來自cookie中的sessionid與外部呼叫引數傳來sessionid並切換到對應的會話
	 * 如都不存在sessionid則交由shiro原類處理
	 */
	@Override
	protected Serializable getSessionId(ServletRequest request,	ServletResponse response) {
        // 其實這裡還可以使用如下引數:cookie中的session名稱:如:JSESSIONID=xxx,路徑中的 ;JESSIONID=xxx,但建議還是使用 __sid引數。
		javax.servlet.http.Cookie[] cookies = ((HttpServletRequest)request).getCookies();
		String sid = request.getParameter("token");
		if(StrUtils.isEmpty(sid)){
			if(cookies !=null){
				for(javax.servlet.http.Cookie c : cookies){
					if(c.getName().equals(domain)){
						sid=c.getValue();
					}
				}
			}
		}else{
			try {
				DESUtils des = new DESUtils(ConstantDate.DESPassword.SSO_TOKEN);
				sid =des.encrypt(sid);
			} catch (Exception e) {
				e.printStackTrace();
				sid="";
			}
		}
		if (StringUtils.isNotBlank(sid)) {
                        //設定session來源於URL
			request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, ShiroHttpServletRequest.URL_SESSION_ID_SOURCE);
			request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sid);
			request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
			return sid;
		}else{
			return super.getSessionId(request, response);
		}
	}

}

這是我繼承了原有的類,然後重寫了其中的getSessionId的方法,大家從程式碼中可以看出,我的sessionid不僅可以通過cookie中去獲取,而且還可以通過引數來傳遞並且是加密的,這種做法是可以保持客戶端包括通過httpClient訪問的正常會話狀態。大家都知道HttpClient預設應該是不保持cookie的如果要保持就要設定,如果通過這種方式來保持會話1、可以減少httpClient的設定增加服務端的靈活性。2、傳來的token不僅可以當做是一個會議的保持方式,也可以做為一個互動的標識。

sessionManager裡面有幾個屬性:

1、globalSessionTimeout:設定全域性的Session過期時間。

2、sessionDAO:因為shiro的session都是存在快取中的,所以這個是針對session的一個CRUD操作。

3、sessionIdCookie:這個是對當前session的cookie一個設定,主要是引用org.apache.shiro.web.servlet.SimpleCookie這個bean,詳細的可以看第一章上的配置。

4、sessionValidationSchedulerEnabled:這個是設定是啟用定時器,如果啟用會定時清理已經過期的會話快取,注意只能清理會話快取也就是session快取,預設時間是30

鍾,可以在SessionManager裡面設定一個setSessionValidationInterval屬性來改變預設時間。

shiro還有很多的設定,這裡只是其中一小點,感興越的朋友可以去看一下官網的文件,我英文是硬傷只能撿便宜了。