Shiro + EHCache 缓存的使用。

我是用 Maven  管理的项目,先上依赖包:

  1. ehcache-core
  2. net.sf.ehcache
  3. 2.5.0
  4. org.apache.shiro
  5. shiro-ehcache
  6. 1.2.2

 

我现在项目一直是用的  Shiro  +  Redis  来结合使用,解决的问题有

  1. 用户权限控制。
  2. 分布式部署 Session  共享。
  3. Cookie  管理。
  4. 缓存  管理。
  5. 用户信息、在线用户管理。
  6. ... ...

本文只介绍 Shiro  +  EHCache  的结合。因为我项目之前用的是 Redis  ,但是项目实际应用没那么多要求,就采用本地 缓存   EHCache  来解决了。

首先有两种方式来创建缓存实列:

一、 Spring  创建方式。

 
  1. p:configLocation="classpath:ehcache.xml">
  2.  
  3. p:cacheManager-ref="cacheManagerFactory" >

二、Bean创建方式。

 

我先暂且用第二种。

EHCache配置文件说明。

一、 EHCache 配置文件代码。

 
  1.  
  2.  
  3. maxEntriesLocalHeap="2000"
  4. eternal="false"
  5. timeToIdleSeconds="3600"
  6. timeToLiveSeconds="0"
  7. overflowToDisk="false"
  8. statistics="true">
  9.  
  10. maxEntriesLocalHeap="2000"
  11. eternal="false"
  12. timeToIdleSeconds="3600"
  13. timeToLiveSeconds="0"
  14. overflowToDisk="false"
  15. statistics="true">
  16.  
  17. maxEntriesLocalHeap="2000"
  18. eternal="false"
  19. timeToIdleSeconds="3600"
  20. timeToLiveSeconds="0"
  21. overflowToDisk="false"
  22. statistics="true">
  23.  
  24. maxEntriesLocalHeap="2000"
  25. eternal="false"
  26. timeToIdleSeconds="3600"
  27. timeToLiveSeconds="0"
  28. overflowToDisk="false"
  29. statistics="true">
  30. maxElementsInMemory="2000"
  31. maxEntriesLocalHeap="2000"
  32. eternal="false"
  33. timeToIdleSeconds="0"
  34. timeToLiveSeconds="0"
  35. maxElementsOnDisk="0"
  36. overflowToDisk="true"
  37. memoryStoreEvictionPolicy="FIFO"
  38. statistics="true">

二、 EHCache  配置文件解释:

 name  Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)
 maxElementsInMemory  内存中保持的对象数量
 maxElementsOnDisk  DiskStore中保持的对象数量,默认值为0,表示不限制
 eternal  是否是永恒数据,如果是,则它的超时设置会被忽略
 overflowToDisk  如果内存中数据数量超过maxElementsInMemory限制,是否要缓存到磁盘上
 timeToIdleSeconds  对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问
 timeToLiveSeconds  对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问
 diskPersistent  是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false
 diskExpiryThreadIntervalSeconds  对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次
 diskSpoolBufferSizeMB  DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore
 memoryStoreEvictionPolicy  如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU

三、 EHCache  管理类。

 
  1. package net.wenyifan.common.shiro;
  2.  
  3. import java.util.Collection;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. import net.wenyifan.common.util.StringUtils;
  8.  
  9. import org.apache.shiro.cache.Cache;
  10. import org.apache.shiro.cache.CacheException;
  11. import org.apache.shiro.cache.ehcache.EhCacheManager;
  12. import org.apache.shiro.session.Session;
  13. /**
  14. *
  15. * 开发公司:itboy.net
  16. * 版权:itboy.net
  17. *

  18. *
  19. * EHCache管理
  20. *
  21. *

  22. *
  23. * 区分 责任人 日期    说明
  24. * 创建 周柏成 2016年2月16日  
  25. *

  26. * *******
  27. *

  28. * @author zhou-baicheng
  29. * @email [email protected]
  30. * @version 1.0,2016年2月16日
  31. *
  32. */
  33. public class CacheManager implements Cache {
  34.  
  35. private EhCacheManager cacheManager;
  36.  
  37. private Cache cache = null;
  38.  
  39. public Cache getCache() {
  40. try {
  41. if(null == cache){
  42. cache = cacheManager.getCache("shiro_cache");
  43. }
  44. } catch (Exception e) {
  45. throw new RuntimeException(e);
  46. }
  47. return cache;
  48. }
  49.  
  50. @Override
  51. public void clear() throws CacheException {
  52. getCache().clear();
  53. }
  54.  
  55. @Override
  56. public V get(K key) throws CacheException {
  57. return getCache().get(key);
  58. }
  59.  
  60. @Override
  61. public Set keys() {
  62.  
  63. return getCache().keys();
  64. }
  65.  
  66. @Override
  67. public V put(K key, V value) throws CacheException {
  68. return getCache().put(key, value);
  69. }
  70.  
  71. @Override
  72. public V remove(K key) throws CacheException {
  73. return getCache().remove(key);
  74. }
  75.  
  76. @Override
  77. public int size() {
  78. return getCache().size();
  79. }
  80.  
  81. @Override
  82. public Collection values() {
  83. return getCache().values();
  84. }
  85.  
  86. public EhCacheManager getCacheManager() {
  87. return cacheManager;
  88. }
  89.  
  90. public void setCacheManager(EhCacheManager cacheManager) {
  91. this.cacheManager = cacheManager;
  92. }
  93.  
  94. public void setCache(Cache cache) {
  95. this.cache = cache;
  96. }
  97.  
  98. /**
  99. * 获取所有Session
  100. * @throws Exception
  101. */
  102. public Collection AllSession() throws Exception {
  103. Set sessions = new HashSet();
  104. try {
  105. //TODO 注意事项:必须此缓存只存储Session,要不造成性能下降
  106. cache = getCache();
  107. Collection values = cache.values();
  108. for (V v : values) {
  109. if(StringUtils.isNotBlank(v) && v instanceof Session){
  110. sessions.add((Session)v);
  111. }
  112. }
  113. } catch (Exception e) {
  114. throw e;
  115. }
  116. return sessions;
  117. }
  118. }

shiro  在使用 缓存  存储 Session  或者 存储其他的时候就可以用这个类了。

你可能感兴趣的:(Shiro)