使用Shiro
shiro是什么以及shiro的简单使用10分钟入门Shiro已经是做过简单的介绍了,这篇算是上一篇的扩展吧,先上两张图复习下什么是shiro。
使用CacheManager作为缓存实现
1.Cache 作用
Cache 缓存: 计算机内存中一段数据
作用: 用来减轻DB的访问压力,从而提高系统的查询效率
流程:
2.使用shiro中默认EhCache实现缓存
1.引入依赖
<dependency> <groupId>org.apache.shirogroupId> <artifactId>shiro-ehcacheartifactId> <version>1.5.3version>dependency>
2.开启缓存
// Ream @Bean public Realm getRealm(){ CustomerRealm realm = new CustomerRealm(); // 修改Realm的密码匹配器为Hash密码匹配器 HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(); // 设置加密算法为MD5 matcher.setHashAlgorithmName("md5"); // 设置散列次数 matcher.setHashIterations(1024); realm.setCredentialsMatcher(matcher); // 缓存管理器 realm.setAuthenticationCachingEnabled(true);// 开启认证缓存 realm.setAuthorizationCachingEnabled(true);// 开启授权缓存 realm.setCacheManager(new EhCacheManager());// 设置缓存管理器 return realm; }
3.shiro中使用Redis作为缓存实现
1.引入redis依赖
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-redisartifactId>dependency>
2.配置redis连接
spring.redis.port=redis的端口号spring.redis.host=你的redis服务器地址spring.redis.database=0
3.实现redisCache的思路
基于Shiro提供的EhCache,你会发现动手实现一个RedisCache是非常的简单,点进realm.setCacheManager()方法发现人家需要一个CacheManager类型的参数。
public void setCacheManager(CacheManager cacheManager) { this.cacheManager = cacheManager; this.afterCacheManagerSet(); }
点进CacheManager发现这东西是一个接口。
package org.apache.shiro.cache;public interface CacheManager { CachegetCache(String var1) throws CacheException;}
那事情就变得简单起来的我们只要编写一个RedisCacheManager实现CacheManager这个接口实现getCache这个方法就好啦。再看一下Cache这个接口是不是和redis的键值对操作毫无违和感呢。
public interface Cache<K, V> { V get(K var1) throws CacheException; V put(K var1, V var2) throws CacheException; V remove(K var1) throws CacheException; void clear() throws CacheException; int size(); Setkeys(); Collectionvalues();}
4.开发RedisCacheManager
public class RedisCacheManager implements CacheManager { @Override public CachegetCache(String cacheName) throws CacheException { System.out.println("缓存名称: "+cacheName); return new RedisCache(cacheName); }}
5.开发RedisCache实现
public class RedisCache<K,V> implements Cache<K,V> { private String cacheName; public RedisCache() { } public RedisCache(String cacheName) { this.cacheName = cacheName; } @Override public V get(K k) throws CacheException { System.out.println("获取缓存:"+ k); return (V) getRedisTemplate().opsForHash().get(this.cacheName,k.toString()); } @Override public V put(K k, V v) throws CacheException { System.out.println("设置缓存key: "+k+" value:"+v); getRedisTemplate().opsForHash().put(this.cacheName,k.toString(),v); return null; } @Override public V remove(K k) throws CacheException { return (V) getRedisTemplate().opsForHash().delete(this.cacheName,k.toString()); } @Override public v remove(k k) throws CacheException { return (v) getRedisTemplate().opsForHash().delete(this.cacheName,k.toString()); } @Override public void clear() throws CacheException { getRedisTemplate().delete(this.cacheName); } @Override public int size() { return getRedisTemplate().opsForHash().size(this.cacheName).intValue(); } @Override public Setkeys() { return getRedisTemplate().opsForHash().keys(this.cacheName); } @Override public Collectionvalues() { return getRedisTemplate().opsForHash().values(this.cacheName); } private RedisTemplate getRedisTemplate(){ RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; } //封装获取redisTemplate private RedisTemplate getRedisTemplate(){ RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; }}
6.将shiro的缓存管理器切换为RedisCacheManager
realm.setCacheManager(new RedisCacheManager());
这样分布式的系统使用我们的Shiro作为安全框架也不用担心缓存的问题啦。
另外有时间的话下面这个视频把Shiro讲解的可谓是非常细致啦,记得三连哦。
https://www.bilibili.com/video/BV1uz4y197Zm