1. 概述
1.1. 为什么要使用缓存
在没有使用缓存的情况下,每发送一次请求都会调用一次doGetAuthorizationInfo方法来进行用户的授权操作,会频繁的访问数据库,影响效率
但是我们知道,一个用户具有的权限一般不会频繁的修改,也就是每次授权的内容都是一样的,所以我们希望在用户登录成功的第一次授权成功后将用户的权限保存在缓存中,下一次请求授权的话就直接从缓存中获取,这样效率会更高一些。
1.2 Cache 作用
Cache 缓存:计算机内存中的一段数据
作用 : 减轻访问数据库的压力,从而提高系统的查询效率
流程 :
2. 默认的 EhCache 实现缓存
-
引入 Shiro 和 EhCache 的整合包
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-ehcache --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.6.0</version> </dependency>
-
在 Shiro 的配置文件 中开启缓存管理
//3. realm //让 spring 托管自定义的 realm 类 @Bean public UserRealm userRealm(){ UserRealm realm = new UserRealm(); //==密码加密================ // 新建 HashedCredentialsMatcher 凭证匹配器 HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher(); // 指定算法的名字 credentialsMatcher.setHashAlgorithmName("md5"); // 指定散列的次数 credentialsMatcher.setHashIterations(1024); // 把 HashedCredentialsMatcher 存入 Realm realm.setCredentialsMatcher(credentialsMatcher); // ===开启缓存=============== // 开启 EhCache 缓存管理 realm.setCacheManager(new EhCacheManager()); // 开启全局缓存管理 realm.setCachingEnabled(true); // 开启授权的缓存管理 realm.setAuthorizationCachingEnabled(true); // 指定授权缓存的名字,默认为 当前方法名+Authorization realm.setAuthorizationCacheName("authorizationCache"); // 开启认证的缓存管理 realm.setAuthenticationCachingEnabled(true); realm.setAuthenticationCacheName("authenticationCache"); return realm; }
-
开启日志,查看 SQL 执行情况
logging: level: com.demo.mapper: DEBUG
-
启动项目测试
第一次执行
多次刷新页面,不再执行查询权限信息