0
点赞
收藏
分享

微信扫一扫

九、Shiro缓存管理

若如初梘 2022-06-21 阅读 56

一、缓存管理的作用
  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>


举报

相关推荐

0 条评论