shiro提供了完整的企业级会话还礼功能,不依赖与底层容器(如web容器Tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对web的透明支持,SSO单点登录的支持等特性。
一. 会话相关的API:org.apache.shiro.session.Session
1. Subject.getSession():获取会话,其等价于Subject.getSession(true):如果当前没有Session对象会创建一个;Subject.getSession(false):如果当前没有Session则返回null。
2. 获取当前会话的唯一ID:Serializable getId()
3. 获取当前Subject的主机地址:String getHost()
4. 获取/设置当前Session过期时间:
long getTimeout() throws InvalidSessionException void setTimeout(long maxIdleTimeInMillis) throws InvalidSessionException
5. 获取Session的启动时间/最后访问时间:
如果是JavaSE应用需要自己定期调用session.touch()去更新最后访问时间;如果是Web应用,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间。
Date getStartTimestamp()
Date getLastAccessTime()
6. 更新会话最后访问时间以及销毁会话;当Subject.logout()时会自动调用stop
void touch() throws InvalidSessionException void stop() throws InvalidSessionException
7. 设置/获取/删除会话属性:
void setAttribute(Object key,Object value)throws InvalidSessionException Object getAttribute(Object key)throws InvalidSessionException Object removeAttribute(Object key)throws InvalidSessionException
二. 会话监听器:org.apache.shiro.session.SessionListener
会话监听器用于监听会话创建、过期及停止
package org.apache.shiro.session; public interface SessionListener { void onStart(Session var1); void onStop(Session var1); void onExpiration(Session var1); }
三. SessionDAO:org.apache.shiro.session.mgt.eis.SessionDAO
AbstractSessionDAO 提供了SessionDAO 的基础实现, 如生成会话ID等
CachingSessionDAO 提供了对开发者透明的会话缓存的功能,需要设置相应的 CacheManager
MemorySessionDAO 直接在内存中进行会话维护
EnterpriseCacheSessionDAO 提供了缓存功能的会话维护,默认情况下使用 MapCache 实现,内部使用ConcurrentHashMap 保存缓存的会话。
四. 会话验证:
Shiro 提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话
出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在 web 环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,Shiro 提供了会话验证调度器SessionValidationScheduler
Shiro 也提供了使用Quartz会话验证调度器:QuartzSessionValidationScheduler