(四) Session管理 --《springboot与shiro整合》
登录成功后使用Subject.getSession()即可获取会话;其等价于Subject.getSession(true),即如果当前没有创建Session对象会创建一个;
另外Subject.getSession(false),如果当前没有创建Session则返回null(不过默认情况下如果启用会话存储功能的话在创建Subject时会主动创建一个Session)。
JAVA代码
session.getId();
获取session唯一id
session.getHost();
获取当前Subject的主机地址,该地址是通过HostAuthenticationToken.getHost()提供的。
session.getTimeout();
session.setTimeout(毫秒);
获取/设置当前Session的过期时间;
session.getStartTimestamp();
session.getLastAccessTime();
获取会话的启动时间及最后访问时间
会话管理器
会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。是Shiro的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager,DefaultSecurityManager及DefaultWebSecurityManager默认SecurityManager都继承了SessionsSecurityManager。
1.自定义SessionDao 持久化session 相关信息
@Component public class ShiroSessionDao extends CachingSessionDAO { @Autowired private SessionDao sessionDao; @Override public Serializable doCreate(Session session) { ShiroSession ss = new ShiroSession(); Serializable sessionId = generateSessionId(session); assignSessionId(session, sessionId); ss.setSession(sessionId.toString()); ss.setHost(session.getHost()); sessionDao.createSession(ss); return sessionId; } @Override public void doDelete(Session session) { Serializable sessionId = session.getId(); sessionDao.deleteSession(sessionId.toString()); } @Override protected Session doReadSession(Serializable sessionId) { return super.getCachedSession(sessionId); } @Override protected void doUpdate(Session session) { } }
2.配置SessionManager
//配置设置会话ID生成器, @Bean public JavaUuidSessionIdGenerator sessionIdGenerator(){ return new JavaUuidSessionIdGenerator(); } @Bean public SessionDAO getSessionDao(){ ShiroSessionDao sessionDao = new ShiroSessionDao(); sessionDao.setSessionIdGenerator(sessionIdGenerator()); return sessionDao; } @Bean public SessionManager sessionManager(){ SessionManager sessionManager = new SessionManager(); ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler(); scheduler.setInterval(180000); scheduler.setSessionManager(sessionManager); sessionManager.setGlobalSessionTimeout(180000); sessionManager.setSessionValidationScheduler(scheduler); sessionManager.setSessionDAO(getSessionDao()); return sessionManager; } @Bean public EhCacheManager cacheManager(){ EhCacheManager cache = new EhCacheManager(); cache.setCacheManagerConfigFile("classpath:ehcache.xml"); return cache; }
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myShiroRealm());
securityManager.setSessionManager(sessionManager());
securityManager.setCacheManager(cacheManager());
return securityManager;
}
ExecutorServiceSessionValidationScheduler:会话验证调度器,定时检测会话是否过期
现在用户会话都会保存到数据库中,由ExecutorServiceSessionValidationScheduler定时检测是否过期