加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 经验 > 正文

shiro会话管理示例代码

发布时间:2020-12-24 16:02:23 所属栏目:经验 来源:网络整理
导读:Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。即直接使

AbstractSessionDAO提供了SessionDAO的基础实现,如生成会话ID等;CachingSessionDAO提供了对开发者透明的会话缓存的功能,只需要设置相应的CacheManager即可;MemorySessionDAO直接在内存中进行会话维护;而EnterpriseCacheSessionDAO提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。

可以通过如下配置设置SessionDAO:

Java代码  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
sessionManager.sessionDAO=$sessionDAO 

Shiro提供了使用Ehcache进行会话存储,Ehcache可以配合TerraCotta实现容器无关的分布式集群。

首先在pom.xml里添加如下依赖:

Java代码  

<dependency> 
 <groupId>org.apache.shiro</groupId> 
 <artifactId>shiro-ehcache</artifactId> 
 <version>1.2.2</version> 
</dependency> 

接着配置shiro-web.ini文件:   

Java代码  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
sessionDAO. activeSessionsCacheName=shiro-activeSessionCache 
sessionManager.sessionDAO=$sessionDAO 
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager 
cacheManager.cacheManagerConfigFile=classpath:ehcache.xml 
securityManager.cacheManager = $cacheManager 

sessionDAO. activeSessionsCacheName:设置Session缓存名字,默认就是shiro-activeSessionCache;

cacheManager:缓存管理器,用于管理缓存的,此处使用Ehcache实现;

cacheManager.cacheManagerConfigFile:设置ehcache缓存的配置文件;

securityManager.cacheManager:设置SecurityManager的cacheManager,会自动设置实现了CacheManagerAware接口的相应对象,如SessionDAO的cacheManager;

然后配置ehcache.xml:

Java代码  

<cache name="shiro-activeSessionCache" 
  maxEntriesLocalHeap="10000" 
  overflowToDisk="false" 
  eternal="false" 
  diskPersistent="false" 
  timeToLiveSeconds="0" 
  timeToIdleSeconds="0" 
  statistics="true"/> 

Cache的名字为shiro-activeSessionCache,即设置的sessionDAO的activeSessionsCacheName属性值。 

另外可以通过如下ini配置设置会话ID生成器:

Java代码  

sessionIdGenerator=org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator 
sessionDAO.sessionIdGenerator=$sessionIdGenerator 

用于生成会话ID,默认就是JavaUuidSessionIdGenerator,使用java.util.UUID生成。 

如果自定义实现SessionDAO,继承CachingSessionDAO即可:

Java代码  

public class MySessionDAO extends CachingSessionDAO { 
 private JdbcTemplate jdbcTemplate = JdbcTemplateUtils.jdbcTemplate(); 
  protected Serializable doCreate(Session session) { 
  Serializable sessionId = generateSessionId(session); 
  assignSessionId(session,sessionId); 
  String sql = "insert into sessions(id,session) values(?,?)"; 
  jdbcTemplate.update(sql,sessionId,SerializableUtils.serialize(session)); 
  return session.getId(); 
 } 
protected void doUpdate(Session session) { 
 if(session instanceof ValidatingSession && !((ValidatingSession)session).isValid()) { 
  return; //如果会话过期/停止 没必要再更新了 
 } 
  String sql = "update sessions set session=? where id=?"; 
  jdbcTemplate.update(sql,SerializableUtils.serialize(session),session.getId()); 
 } 
 protected void doDelete(Session session) { 
  String sql = "delete from sessions where id=?"; 
  jdbcTemplate.update(sql,session.getId()); 
 } 
 protected Session doReadSession(Serializable sessionId) { 
  String sql = "select session from sessions where id=?"; 
  List<String> sessionStrList = jdbcTemplate.queryForList(sql,String.class,sessionId); 
  if(sessionStrList.size() == 0) return null; 
  return SerializableUtils.deserialize(sessionStrList.get(0)); 
 } 
} 

doCreate/doUpdate/doDelete/doReadSession分别代表创建/修改/删除/读取会话;此处通过把会话序列化后存储到数据库实现;接着在shiro-web.ini中配置:

Java代码  

sessionDAO=com.github.zhangkaitao.shiro.chapter10.session.dao.MySessionDAO 

其他设置和之前一样,因为继承了CachingSessionDAO;所有在读取时会先查缓存中是否存在,如果找不到才到数据库中查找。 

会话验证

Shiro提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,Shiro提供了会话验证调度器SessionValidationScheduler来做这件事情。

可以通过如下ini配置开启会话验证:   

Java代码  

sessionValidationScheduler=org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler 
sessionValidationScheduler.interval = 3600000 
sessionValidationScheduler.sessionManager=$sessionManager 
sessionManager.globalSessionTimeout=1800000 
sessionManager.sessionValidationSchedulerEnabled=true
sessionManager.sessionValidationScheduler=$sessionValidationScheduler 

sessionValidationScheduler:会话验证调度器,sessionManager默认就是使用ExecutorServiceSessionValidationScheduler,其使用JDK的ScheduledExecutorService进行定期调度并验证会话是否过期;

sessionValidationScheduler.interval:设置调度时间间隔,单位毫秒,默认就是1小时;

sessionValidationScheduler.sessionManager:设置会话验证调度器进行会话验证时的会话管理器;

sessionManager.globalSessionTimeout:设置全局会话超时时间,默认30分钟,即如果30分钟内没有访问会话将过期;

sessionManager.sessionValidationSchedulerEnabled:是否开启会话验证器,默认是开启的;

sessionManager.sessionValidationScheduler:设置会话验证调度器,默认就是使用ExecutorServiceSessionValidationScheduler。 

Shiro也提供了使用Quartz会话验证调度器:

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读