shiro----------------6.缓存管理

/**
 * 缓存管理器的配置
 */
@Bean(name = "ShiroRedisCacheManager")
public ShiroRedisCacheManager redisCacheManager() {
    ShiroRedisCacheManager redisCacheManager = new ShiroRedisCacheManager();
    redisCacheManager.createCache(RedisKey.CACHE_KEY);
    return redisCacheManager;
}

分布式时采用redis作为缓存管理

public class ShiroRedisCacheManager  extends AbstractCacheManager {

    @Autowired
    @Qualifier("shiroRedisTemplate")
    private RedisTemplate  redisTemplate;

    private static String cachePrefix = RedisKey.CACHE_KEY;

    public ShiroRedisCacheManager(){
    }

    @Override
    protected Cache createCache(String name) throws CacheException {
        return new ShiroRedisCache(120, redisTemplate);
    }

    public static class ShiroRedisCache <K,V> implements Cache<K,V>{
        /**
         * 缓存的超时时间,单位为s
         */
        private long expireTime = 120;

        private RedisTemplate<K, V> redisTemplate;

        public ShiroRedisCache() {
            super();
        }

        public ShiroRedisCache(long expireTime, RedisTemplate<K, V> redisTemplate) {
            this.expireTime = expireTime;
            this.redisTemplate = redisTemplate;
        }
        private K makeKey(K name){
            return (K) (cachePrefix+name);
        }

        /**
         * 通过key来获取对应的缓存对象
         * 通过源码我们可以发现,shiro需要的key的类型为Object,V的类型为AuthorizationInfo对象
         */
        @Override
        public V get(K key) throws CacheException {
            return redisTemplate.opsForValue().get(makeKey(key));
        }

        /**
         * 将权限信息加入缓存中
         */
        @Override
        public V put(K key, V value) throws CacheException {
            redisTemplate.opsForValue().set(makeKey(key), value, this.expireTime, TimeUnit.SECONDS);
            return value;
        }

        /**
         * 将权限信息从缓存中删除
         */
        @Override
        public V remove(K key) throws CacheException {
            V v = redisTemplate.opsForValue().get(makeKey(key));
            redisTemplate.opsForValue().getOperations().delete(makeKey(key));
            return v;
        }

        @Override
        public void clear() throws CacheException {
            redisTemplate.getConnectionFactory().getConnection().flushDb();
        }

        @Override
        public int size() {
            return redisTemplate.getConnectionFactory().getConnection().dbSize().intValue();
        }



        @Override
        public Set<K> keys() {
            Set<K> keys = redisTemplate.keys((K) ( cachePrefix+"*"));
            Set<K> sets = new HashSet<>();
            for (K key : keys) {
                sets.add(key);
            }
            return sets;
        }

        @Override
        public Collection<V> values() {
            Set<K> keys = keys();
            List<V> values = new ArrayList<>(keys.size());
            for(K k :keys){
                values.add(get(k));
            }
            return values;
        }
    }

}

由于在实现的是redis的序列化不采用jdkSerializationRedisSerializer会有异常,这里采用在设置一个shiroRedisTemplate

@Bean(value = "shiroRedisTemplate")
public RedisTemplate<String, Object> shiroRedisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    // 开启事务支持
    redisTemplate.setEnableTransactionSupport(true);
    // 使用String格式序列化缓存键 shiro时 valid报错
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
    redisTemplate.setKeySerializer(stringRedisSerializer);
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    redisTemplate.setDefaultSerializer(stringRedisSerializer);
    redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
    return redisTemplate;
}

开启后会存储在redis中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值