一、缓存管理的作用
Shiro的缓存对象CacheManager的作用主要是缓存用户角色和权限信息,这样就避免每次都需要去数据库查询角色和权限信息。
二、改造Shiro缓存,将角色和权限信息存入Reids
(一)创建RedisCache
对象
/**
* @author 咸鱼
* @date 2018/9/11 19:55
* Cache接口实质上就是Shiro自带的缓存增删改接口
* 而RedisCache的目的就是将Shiro管理的缓存放到Reids中进行管理
*/
public class RedisCache<K, V> implements Cache<K, V> {
@Autowired
private JedisUtil jedisUtil;
private static final String PREFIX_CACHE = "shiro-cache:";
/**
* 从这里可以看出,序列化说白了就是将对象转换成字节码数组:
* 一般来说String类型可以直接通过getBytes()方法转换;
* 而其他类型对象需要借助SerializationUtils.serialize(k)工具
*/
private byte[] getKey(K k){
if (k instanceof String){
return (PREFIX_CACHE + k).getBytes();
}
return SerializationUtils.serialize(k);
}
@Override
public V get(K k) throws CacheException {
System.out.println("从Redis中获取角色信息");
byte[] key = getKey(k);
byte[] value = jedisUtil.get(key);
if (value != null){
return (V)SerializationUtils.deserialize(value);
}
return null;
}
@Override
public V put(K k, V v) throws CacheException {
byte[] key = getKey(k);
byte[] value = SerializationUtils.serialize(v);
jedisUtil.set(key, value);
jedisUtil.expire(key, 600);
return v;
}
@Override
public V remove(K k) throws CacheException {
byte[] key = getKey(k);
jedisUtil.delete(key);
return get(k);
}
/**
* 清理就不需要了,因为现在Shiro缓存在redis中的前缀不定,有的前缀有"shiro-cache:",有的没有
*/
@Override
public void clear() throws CacheException {
}
@Override
public int size() {
return 0;
}
@Override
public Set<K> keys() {
return null;
}
@Override
public Collection<V> values() {
return null;
}
}
(二)创建RedisCacheManager对象
/**
* @author 咸鱼
* @date 2018/9/11 19:54
*/
public class RedisCacheManager implements CacheManager {
@Resource
private RedisCache redisCache;
/**
* 返回Cache实例,就是我们改造后的RedisCache对象
* @param s 参数是缓存的name
*/
@Override
public <K, V> Cache<K, V> getCache(String s) throws CacheException {
return redisCache;
}
}
(三)改造配置文件
1.在applicationContext-redis.xml
配置文件中配置RedisCache
和RedisCacheManager
<bean id="redisCache" class="org.pc.cache.RedisCache"/>
<bean id="redisCacheManager" class="org.pc.cache.RedisCacheManager"/>
2.将redisCacheManager
注入到Shiro
的securityManager
对象中
<!--配置securityManager,注意在Spring中使用的是DefaultWebSecurityManager,在非web环境下,使用DefaultSecurityManager-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--配置数据源-->
<property name="realm" ref="realm"/>
<!--配置Shiro的SessionManager对象-->
<property name="sessionManager" ref="sessionManager"/>
<!--配置自定义的Redis缓存管理对象-->
<property name="cacheManager" ref="redisCacheManager"/>
</bean>