package com.doumee.config.shiroMemory; import com.doumee.service.proxy.CacheProxy; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Set; /** * Shiro缓存 * @author Eva.Caesar Liu * @date 2023/02/14 11:14 */ @Scope(value = "prototype") @Slf4j //@Component public class ShiroCache implements Cache { private String keyPrefix = ""; @Autowired private CacheProxy cacheProxy; public ShiroCache () { log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]"); } public ShiroCache(String keyPrefix) { log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]"); this.keyPrefix = keyPrefix; } @Override public Serializable get(Object key) throws CacheException { if (key == null) { return null; } return cacheProxy.get(getKey(key)); } @Override public Serializable put(Object key, Serializable value) throws CacheException { if (key == null) { return null; } cacheProxy.put(getKey(key), value); return value; } public Serializable put(Object key, Serializable value, int timeout) throws CacheException { if (key == null) { return null; } cacheProxy.put(getKey(key), value, timeout); return value; } @Override public void clear() throws CacheException { Set keys = this.keys(); cacheProxy.remove(keys); } @Override public int size() { return this.keys().size(); } @Override public Set keys() { Set keys = cacheProxy.keys(keyPrefix + "*"); if (CollectionUtils.isEmpty(keys)) { return Collections.emptySet(); } return keys; } @Override public Collection values() { Collection values = new ArrayList<>(); Set keys = this.keys(); if (CollectionUtils.isEmpty(keys)) { return values; } for (Object k : keys) { values.add(cacheProxy.get(k)); } return values; } @Override public Serializable remove(Object key) throws CacheException { if (key == null) { return null; } Serializable value = this.get(getKey(key)); cacheProxy.remove(getKey(key)); return value; } private Object getKey (Object key) { return (key instanceof String ? (this.keyPrefix + key) : key); } }