Shiro中的缓存主要用于两种:realm数据和session数据。其中session的缓存在上一节已经讲过了,这节就不再赘述。
Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现,例如ehcache,redis等。
Cache接口
Shiro提供的Cache接口:
public interface Cache<K, V> {
//根据Key获取缓存中的值
public V get(K key) throws CacheException;
//往缓存中放入key-value,返回缓存中之前的值
public V put(K key, V value) throws CacheException;
//移除缓存中key对应的值,返回该值
public V remove(K key) throws CacheException;
//清空整个缓存
public void clear() throws CacheException;
//返回缓存大小
public int size();
//获取缓存中所有的key
public Set<K> keys();
//获取缓存中所有的value
public Collection<V> values();
}
我们在使用的时候需要实现它,例如我们使用redis作为我们的shiro缓存:
@Component
public class RedisCache<K,V> implements Cache<K,V> {
@Resource
RedisUtil redisUtil;
private final String CACHE_PREFIX = "redis-cache";
private byte[] getKey(K k){
if(k instanceof String){
return (CACHE_PREFIX+k).getBytes();
}
return SerializationUtils.serialize(k);
}
@Override
public V get(K key) throws CacheException {
System.out.println("从redis中取数据");
byte[] value = redisUtil.get(getKey(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);
redisUtil.set(key,value);
redisUtil.expire(key,600);
return v;
}
@Override
public V remove(K k) throws CacheException {
byte[] key = getKey(k);
byte[] value = redisUtil.get(key);
redisUtil.del(key);
if(value != null ){
return (V)SerializationUtils.deserialize(value);
}
return null;
}
@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;
}
CacheManager接口
cacheManager接口用来注入securityManager中,提供cache的获取
public interface CacheManager {
//根据缓存名字获取一个Cache
public <K, V> Cache<K, V> getCache(String name) throws CacheException;
}
我们可以实现这个接口,然后再securityManager中注入,实现自定义的缓存处理。
public class RedisCacheManager implements CacheManager {
@Resource
private RedisCache redisCache;
@Override
public <K, V> Cache<K, V> getCache(String name) throws CacheException {
return redisCache;
}
}
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setCacheManager(redisCacheManager());
return manager;
}
@Bean
public RedisCacheManager redisCacheManager(){
RedisCacheManager cacheManager = new RedisCacheManager();
return cacheManager;
}
网友评论