缓存

发表时间:2018-03-20 10:04:12 浏览量( 9 ) 留言数( 0 )

学习目标:

1、了解Shiro缓存的作用

2、了解Shiro的Session的基本配置作用


学习过程:

   为什么需要使用缓存?前面我们通过测试已经知道了。shiro每次授权都会通过realm获取权限信息,如果是访问数据库,每一次都需要读取数据库,那么效率会很低的。为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合。

一、Shiro的缓存管理

1、搭建环境:添加Ehcache的包,maven的配置如下:

		<dependency>
		    <groupId>net.sf.ehcache</groupId>
		    <artifactId>ehcache</artifactId>
		    <version>2.10.4</version>
		</dependency>

2、配置cacheManager

(1)配置ehcache-shiro.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

<diskStore path="d:\ehcache" />

<defaultCache 

maxElementsInMemory="1000" 

maxElementsOnDisk="10000000"

eternal="false" 

overflowToDisk="false" 

diskPersistent="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120" 

diskExpiryThreadIntervalSeconds="120"

memoryStoreEvictionPolicy="LRU">

</defaultCache>

</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:内存数量最大时是否清除。


其他配置项

(2)在shiroContext.xml中配置缓存管理器

	<!-- 缓存管理器 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    	<property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
    </bean>

	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="myCustomRealm" />
		<property name="cacheManager" ref="cacheManager"/>
	</bean>


3、测试

你可以在授权的代码里面打印一句话,只会在第一个次的时候会输出;

	// 授权
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// 获取身份信息
		User user = (User) principals.getPrimaryPrincipal();
		
		System.out.println("调用了授权AuthorizationInfo......");


4、清空缓存

   当用户权限修改后,用户再次登陆shiro会自动调用realm从数据库获取权限数据,如果在修改权限后想立即清除缓存则可以调用realm的clearCache方法清除缓存。

  定义clearCached方法:

	// 清除缓存
	public void clearCached() {
		PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
		super.clearCache(principals);
	}


二、session管理

在shiroContext.xml中配置sessionManager,有关session会话的详细讲解我们在后面在说

   <!-- 会话管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- session的失效时长,单位毫秒 -->
        <property name="globalSessionTimeout" value="600000"/>
        <!-- 删除失效的session -->
        <property name="deleteInvalidSessions" value="true"/>
    </bean>

	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="myCustomRealm" />
		<property name="cacheManager" ref="cacheManager"/>
		<property name="sessionManager" ref="sessionManager" />
	</bean>