九、Shiro缓存管理

一、缓存管理的作用
  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配置文件中配置RedisCacheRedisCacheManager

<bean id="redisCache" class="org.pc.cache.RedisCache"/>

<bean id="redisCacheManager" class="org.pc.cache.RedisCacheManager"/>

2.将redisCacheManager注入到ShirosecurityManager对象中

<!--配置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>

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/82632224