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