shiro 对缓存的管理:
存放缓存是一个ConcurrentMap<String, Cache> caches;caches是一个线程安全的ConcurrentMap类型,在这里,至少存放两个Cache,一个是用来存放session的,一个是用来存放权限(Authorization)的,shiro先从caches里拿,如果拿不到相应的Cache,就调用createCache创建一个,createCache是抽象方法,由子类实现。创建完之后,放到Map中。
shiro创建两个Cache放到ConcurrentMap中,一个name中ShiroCasRealm.authorizationCache(这个名字的命名规则是自定义的realm的名字加".authorizationCache"),这个是shiro启动的时候创建的,用来保存认证信息,一个叫shiro-activeSessionCache(如果session配置成shiro管理并利用缓存),这个是第一次创建session的时候创建的,用来保存session。当用户登录的时候,将会把用户的权限信息保存到name为ShiroCasRealm.authorizationCache的Cache中,以后需要再使用权限信息,直接从Cache中拿而不需要再从数据库中查询。这样也有一个问题,就是当用户权限改变时,就需要用户重新登录把权限信息从新load到Cache中。不过既然我们知道Cache的名字,我们就可以拿到这个Cache,然后把用户的权限信息删除,让shiro在授权时找不到权限而shiro自己从新去load,甚至我们可以删除了,然后再从新load到Cache中
配置缓存管理器:
<bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <!--classpath是缓存属性的配置文件 --> <property name="cacheManagerConfigFile" value="classpath:config/ehcache-shiro.xml" /> </bean>
自定义的Ream,给ShiroRealm指定cacheManager(不指定启动shiro会报提示
):
<bean id="shiroRealm" class="com.xxx.ShiroRealm" > <property name="authorizationCacheName" value="shiro-authorizationCache"/> <property name="cacheManager" ref="shiroEhcacheManager"/> </bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="shiroRealm"></property> <!--注入缓存管理器 --> <property name="cacheManager" ref="shiroEhcacheManager"></property> </bean>
- 缓存属性配置文件:
<ehcache updateCheck="false" name="shiroCache"> <defaultCache <!--最大缓存数量 --> maxElementsInMemory="10000" eternal="true" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" clearOnFlush="false" /> </ehcache>
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
Shiro提供了默认的EHCache的配置xml,如果你要配置自己的EHCache.xml,需要注意以下几点: 1:overflowToDisk=“true” - 这确保当你溢出进程内存时,会话不丢失且能够被序列化到磁盘上。 2: eternal=“true” - 确保缓存项(Session 实例)永不过期或被缓存自动清除。这是很有必要的,因为Shiro 基于计划过程完成自己的验证。如果我们关掉这项,缓存将会在Shiro 不知道的情况下清扫这些Sessions,这可能引起麻烦。 3:如果你想使用一个不同的名字而不是默认的,你可以在EnterpriseCacheSessionDAO 上配置名字,例如:sessionDAO.activeSessionsCacheName = myname 只要确保在ehcahe.xml 中有一项与这个名字匹配