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还有很多的设置,这里只是其中一小点,感兴越的朋友可以去看一下官网的文档,我英文是硬伤只能捡便宜了。