场景描述
现在再添加量Shiro标签后,以HTML形式进行权限管理。是否每一次点击页面的某个菜单,都要经过MyRealm的授权方法,从数据库里查数据。在MyRealm的doGetAuthorizationInfo打印一行sout(“———-查询用户权限—-”);看看登录成功后,引入index.html这句话打印了几次。现在用户zhoudu登录。
检测结果




由上图所示,在初始index.html时一共16个shiro标签,所以执行了16次授权方法。并且每次点击一个菜单又会调用授权方法。如点击“客户查询”,虽然没有用shiro标签修饰但是加上了权限判断的注解,也会打印”———-查询用户权限—-===”)。如下图。

说明无论是初始化,还是点击某个菜单都会查询数据库的数据,而且这些查询是同样的重复的操作,当用户很多时用户点击量很大时会频繁的访问数据库,非常消耗数据库的性能,所以在初始化界面时把数据从数据库里读出来存入缓存中,下次点击某个菜单直接从缓存里寻找,这样性能提高很多。
使用缓存
引入依赖
首页springboot要支持缓存,在引入第三方缓存,然后shiro支持缓存
1 2 3 4 5 6 7 8 9 10 11 12 13
| <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
|
设置缓存策略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" dynamicConfig="false"> <diskStore path="java.io.tmpdir"/> <cache name="users" timeToLiveSeconds="300" maxEntriesLocalHeap="1000"/> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="true" maxElementsOnDisk="10000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
|
配置ShiroConfig
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Bean public EhCacheManager getEhCacheManager() { EhCacheManager ehCacheManager = new EhCacheManager(); ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml"); return ehCacheManager; } @Bean public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm, EhCacheManager ehCacheManager) { DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); defaultWebSecurityManager.setRealm(myRealm); defaultWebSecurityManager.setCacheManager(ehCacheManager); return defaultWebSecurityManager; }
|