/** * Copyright © 2015-2020 JeePlus All rights reserved. */ package com.jeeplus.common.security.shiro.cache; import java.util.Collection; import java.util.Collections; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro.cache.CacheManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import com.google.common.collect.Sets; import com.jeeplus.common.utils.JedisUtils; import com.jeeplus.common.web.Servlets; /** * 自定义授权缓存管理类 * @author jeeplus * @version 2014-7-20 */ public class JedisCacheManager implements CacheManager { private String cacheKeyPrefix = "shiro_cache_"; @Override public Cache getCache(String name) throws CacheException { return new JedisCache(cacheKeyPrefix + name); } public String getCacheKeyPrefix() { return cacheKeyPrefix; } public void setCacheKeyPrefix(String cacheKeyPrefix) { this.cacheKeyPrefix = cacheKeyPrefix; } /** * 自定义授权缓存管理类 * @author jeeplus * @version 2014-7-20 */ public class JedisCache implements Cache { private Logger logger = LoggerFactory.getLogger(getClass()); private String cacheKeyName = null; public JedisCache(String cacheKeyName) { this.cacheKeyName = cacheKeyName; // if (!JedisUtils.exists(cacheKeyName)){ // Map map = Maps.newHashMap(); // JedisUtils.setObjectMap(cacheKeyName, map, 60 * 60 * 24); // } // logger.debug("Init: cacheKeyName {} ", cacheKeyName); } @SuppressWarnings("unchecked") @Override public V get(K key) throws CacheException { if (key == null){ return null; } V v = null; HttpServletRequest request = Servlets.getRequest(); if (request != null){ v = (V)request.getAttribute(cacheKeyName); if (v != null){ return v; } } V value = null; Jedis jedis = null; try { jedis = JedisUtils.getResource(); value = (V)JedisUtils.toObject(jedis.hget(JedisUtils.getBytesKey(cacheKeyName), JedisUtils.getBytesKey(key))); logger.debug("get {} {} {}", cacheKeyName, key, request != null ? request.getRequestURI() : ""); } catch (Exception e) { logger.error("get {} {} {}", cacheKeyName, key, request != null ? request.getRequestURI() : "", e); } finally { JedisUtils.returnResource(jedis); } if (request != null && value != null){ request.setAttribute(cacheKeyName, value); } return value; } @Override public V put(K key, V value) throws CacheException { if (key == null){ return null; } Jedis jedis = null; try { jedis = JedisUtils.getResource(); jedis.hset(JedisUtils.getBytesKey(cacheKeyName), JedisUtils.getBytesKey(key), JedisUtils.toBytes(value)); logger.debug("put {} {} = {}", cacheKeyName, key, value); } catch (Exception e) { logger.error("put {} {}", cacheKeyName, key, e); } finally { JedisUtils.returnResource(jedis); } return value; } @SuppressWarnings("unchecked") @Override public V remove(K key) throws CacheException { V value = null; Jedis jedis = null; try { jedis = JedisUtils.getResource(); value = (V)JedisUtils.toObject(jedis.hget(JedisUtils.getBytesKey(cacheKeyName), JedisUtils.getBytesKey(key))); jedis.hdel(JedisUtils.getBytesKey(cacheKeyName), JedisUtils.getBytesKey(key)); logger.debug("remove {} {}", cacheKeyName, key); } catch (Exception e) { logger.warn("remove {} {}", cacheKeyName, key, e); } finally { JedisUtils.returnResource(jedis); } return value; } @Override public void clear() throws CacheException { Jedis jedis = null; try { jedis = JedisUtils.getResource(); jedis.hdel(JedisUtils.getBytesKey(cacheKeyName)); logger.debug("clear {}", cacheKeyName); } catch (Exception e) { logger.error("clear {}", cacheKeyName, e); } finally { JedisUtils.returnResource(jedis); } } @Override public int size() { int size = 0; Jedis jedis = null; try { jedis = JedisUtils.getResource(); size = jedis.hlen(JedisUtils.getBytesKey(cacheKeyName)).intValue(); logger.debug("size {} {} ", cacheKeyName, size); return size; } catch (Exception e) { logger.error("clear {}", cacheKeyName, e); } finally { JedisUtils.returnResource(jedis); } return size; } @SuppressWarnings("unchecked") @Override public Set keys() { Set keys = Sets.newHashSet(); Jedis jedis = null; try { jedis = JedisUtils.getResource(); Set set = jedis.hkeys(JedisUtils.getBytesKey(cacheKeyName)); for(byte[] key : set){ keys.add((K)key); } logger.debug("keys {} {} ", cacheKeyName, keys); return keys; } catch (Exception e) { logger.error("keys {}", cacheKeyName, e); } finally { JedisUtils.returnResource(jedis); } return keys; } @SuppressWarnings("unchecked") @Override public Collection values() { Collection vals = Collections.emptyList();; Jedis jedis = null; try { jedis = JedisUtils.getResource(); Collection col = jedis.hvals(JedisUtils.getBytesKey(cacheKeyName)); for(byte[] val : col){ vals.add((V)val); } logger.debug("values {} {} ", cacheKeyName, vals); return vals; } catch (Exception e) { logger.error("values {}", cacheKeyName, e); } finally { JedisUtils.returnResource(jedis); } return vals; } } }