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