From 1812198cdb63b5b9da27c20e5606343b7ba73091 Mon Sep 17 00:00:00 2001 From: jiangping <jp@doumee.com> Date: 星期二, 29 八月 2023 11:47:33 +0800 Subject: [PATCH] redis缓存session --- server/src/main/java/doumeemes/config/shiro/ShiroCache.java | 76 ++++++++++++++++++++++++++++++------- 1 files changed, 61 insertions(+), 15 deletions(-) diff --git a/server/src/main/java/doumeemes/config/shiro/ShiroCache.java b/server/src/main/java/doumeemes/config/shiro/ShiroCache.java index 2b2ec2c..6867883 100644 --- a/server/src/main/java/doumeemes/config/shiro/ShiroCache.java +++ b/server/src/main/java/doumeemes/config/shiro/ShiroCache.java @@ -1,34 +1,38 @@ package doumeemes.config.shiro; -import doumeemes.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.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.util.CollectionUtils; import org.springframework.context.annotation.Scope; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.SerializationException; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; +import javax.annotation.Resource; import java.io.Serializable; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Set; +import java.util.concurrent.TimeUnit; /** * Shiro缂撳瓨 * @author Eva.Caesar Liu - * @date 2022/04/18 18:12 + * @date 2023/04/17 12:11 */ -//@Scope(value = "prototype") +@Scope(value = "prototype") @Slf4j -//@Component +@Component public class ShiroCache implements Cache<Object, Serializable> { private String keyPrefix = ""; - @Autowired - private CacheProxy<Object, Serializable> cacheProxy; + @Resource(name="sessionRedisTemplate") + private RedisTemplate<Object, Serializable> redisTemplate; public ShiroCache () { log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]"); @@ -44,7 +48,7 @@ if (key == null) { return null; } - return cacheProxy.get(getKey(key)); + return redisTemplate.opsForValue().get(getKey(key)); } @Override @@ -52,7 +56,7 @@ if (key == null) { return null; } - cacheProxy.put(getKey(key), value); + redisTemplate.opsForValue().set(getKey(key), value); return value; } @@ -60,14 +64,14 @@ if (key == null) { return null; } - cacheProxy.put(getKey(key), value, timeout); + redisTemplate.opsForValue().set(getKey(key), value, timeout, TimeUnit.SECONDS); return value; } @Override public void clear() throws CacheException { Set<Object> keys = this.keys(); - cacheProxy.remove(keys); + redisTemplate.delete(keys); } @Override @@ -77,7 +81,7 @@ @Override public Set<Object> keys() { - Set<Object> keys = cacheProxy.keys(keyPrefix + "*"); + Set<Object> keys = redisTemplate.keys(keyPrefix + "*"); if (CollectionUtils.isEmpty(keys)) { return Collections.emptySet(); } @@ -92,7 +96,7 @@ return values; } for (Object k : keys) { - values.add(cacheProxy.get(k)); + values.add(redisTemplate.opsForValue().get(k)); } return values; } @@ -103,11 +107,53 @@ return null; } Serializable value = this.get(getKey(key)); - cacheProxy.remove(getKey(key)); + redisTemplate.delete(getKey(key)); return value; } private Object getKey (Object key) { + if (key instanceof PrincipalCollection) { + return this.keyPrefix + getRedisKeyFromPrincipalIdField((PrincipalCollection)key); + } return (key instanceof String ? (this.keyPrefix + key) : key); } + + /** + * 鑾峰彇redis cache key + */ + private String getRedisKeyFromPrincipalIdField(PrincipalCollection key) { + Object principalObject = key.getPrimaryPrincipal(); + if (principalObject instanceof String) { + return principalObject.toString(); + } else { + Method pincipalIdGetter = this.getPrincipalIdGetter(principalObject); + return this.getIdObj(principalObject, pincipalIdGetter); + } + } + + private Method getPrincipalIdGetter(Object principalObject) { + Method pincipalIdGetter; + String principalIdMethodName = this.getPrincipalIdMethodName(); + + try { + pincipalIdGetter = principalObject.getClass().getMethod(principalIdMethodName); + return pincipalIdGetter; + } catch (NoSuchMethodException e) { + throw new SerializationException(e.getMessage(), e); + } + } + + private String getIdObj(Object principalObject, Method pincipalIdGetter) { + try { + Object idObj = pincipalIdGetter.invoke(principalObject); + String redisKey = idObj.toString(); + return redisKey; + } catch (Exception e) { + throw new SerializationException(e.getMessage(), e); + } + } + + private String getPrincipalIdMethodName() { + return "getId"; + } } -- Gitblit v1.9.3