shiro教程8(缓存管理)

缓存

为什么要使用缓存

  在没有使用缓存的情况下,我们每次发送请求都会调用一次doGetAuthorizationInfo方法来进行用户的授权操作,但是我们知道,一个用户具有的权限一般不会频繁的修改,也就是每次授权的内容都是一样的,所以我们希望在用户登录成功的第一次授权成功后将用户的权限保存在缓存中,下一次请求授权的话就直接从缓存中获取,这样效率会更高一些。

使用Ehcache来实现缓存

引入jar包

<dependency>
	<groupId>org.apache.shirogroupId>
	<artifactId>shiro-springartifactId>
	<version>1.2.3version>
dependency>
<dependency>
	<groupId>org.apache.shirogroupId>
	<artifactId>shiro-ehcacheartifactId>
	<version>1.2.3version>
dependency>
<dependency>
	<groupId>net.sf.ehcachegroupId>
	<artifactId>ehcache-coreartifactId>
	<version>2.5.0version>
dependency>

添加ehcache的配置文件


<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
	
	<diskStore path="C:\tools\ehcache" />
	 
	<defaultCache 
		maxElementsInMemory="1000" 
		maxElementsOnDisk="10000000"
		eternal="false" 
		overflowToDisk="false" 
		diskPersistent="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120" 
		diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	defaultCache>
ehcache>

在shiro的配置文件中配置缓存

 	
 	<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
 		
 		<property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
 	bean>
 	
 	
 	<bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
 		
 		<property name="realm" ref="myRealm"/>
 		<property name="cacheManager" ref="cacheManager"/>
 	bean>

shiro教程8(缓存管理)_第1张图片

测试

shiro教程8(缓存管理)_第2张图片shiro教程8(缓存管理)_第3张图片

shiro授权的源码分析

看HasRole方法
在这里插入图片描述shiro教程8(缓存管理)_第4张图片shiro教程8(缓存管理)_第5张图片

清空缓存

在自定义realm中添加清空方法

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

添加业务处理方法

shiro教程8(缓存管理)_第6张图片

测试

  第一次正常请求会授权,之后访问从缓存中获取。当调用清空缓存方法后,再次请求的时候因为缓存已经空了,所以会再次授权,
  场景: 权限修改生效后,立即刷新清空缓存,则可以实现用户不退出生效新的权限

你可能感兴趣的:(shiro专栏)