Browse Source

shiro调整

laowo 3 years ago
parent
commit
fa68a31962

+ 12 - 56
src/main/java/com/usky/config/redis/RedisConfig.java

@@ -1,22 +1,18 @@
 package com.usky.config.redis;
 
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.usky.config.shiro.MyRedisSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
-
 import javax.annotation.Resource;
 
 /**
@@ -25,13 +21,11 @@ import javax.annotation.Resource;
  * @Return:
 */
 @Slf4j
-@EnableCaching
 @Configuration
-public class RedisConfig {
+public class RedisConfig extends CachingConfigurerSupport {
 
 	@Resource
 	private LettuceConnectionFactory lettuceConnectionFactory;
-
 	/**
 	 * RedisTemplate配置
 	 * @param lettuceConnectionFactory
@@ -39,35 +33,8 @@ public class RedisConfig {
 	 */
 	@Bean
 	public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
-//		log.info(" --- redis config init --- ");
-//		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =jacksonSerializer();
-//		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
-//		redisTemplate.setConnectionFactory(lettuceConnectionFactory);
-//		RedisSerializer<?> stringSerializer = new StringRedisSerializer();
-//		// key序列化
-//		redisTemplate.setKeySerializer(stringSerializer);
-//		// value序列化
-//		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
-//		// Hash key序列化
-//		redisTemplate.setHashKeySerializer(stringSerializer);
-//		// Hash value序列化
-//		redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
-//		redisTemplate.afterPropertiesSet();
-//		return redisTemplate;
-
-//		MyRedisSerializer myRedisSerializer = new MyRedisSerializer();
-//		// 7.设置 value 的转化格式和 key 的转化格式 默认使用的是JdkSerializationRedisSerializer
-//		template.setValueSerializer(myRedisSerializer);
-//		template.setHashValueSerializer(myRedisSerializer);
-//		// 设置键(key)的序列化采用StringRedisSerializer。
-//		template.setKeySerializer(new StringRedisSerializer());
-//		template.setHashKeySerializer(new StringRedisSerializer());
-//		template.setDefaultSerializer(myRedisSerializer);
-//		template.afterPropertiesSet();
-//		return template;
-
 		log.info(" --- redis config init --- ");
-		MyRedisSerializer jackson2JsonRedisSerializer = new MyRedisSerializer();
+		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =jacksonSerializer();
 		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
 		redisTemplate.setConnectionFactory(lettuceConnectionFactory);
 		RedisSerializer<?> stringSerializer = new StringRedisSerializer();
@@ -81,27 +48,16 @@ public class RedisConfig {
 		redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
 		redisTemplate.afterPropertiesSet();
 		return redisTemplate;
-
-
-
-
-
 	}
-//	private Jackson2JsonRedisSerializer jacksonSerializer() {
-//		Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
-//		ObjectMapper objectMapper = new ObjectMapper();
-//		objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-//		objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-//		jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
-//		return jackson2JsonRedisSerializer;
-//	}
 
-	@Bean
-	@ConditionalOnMissingBean(StringRedisTemplate.class)
-	public RedisTemplate<String, String> MystringRedisTemplate(RedisConnectionFactory factory) {
-		return new StringRedisTemplate(factory);
+	private Jackson2JsonRedisSerializer jacksonSerializer() {
+		Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
+		objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
+		jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+		return jackson2JsonRedisSerializer;
 	}
 
 
-
 }

+ 0 - 23
src/main/java/com/usky/config/redis/RedisProperties.java

@@ -1,23 +0,0 @@
-package com.usky.config.redis;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
-
-@Configuration
-@ConfigurationProperties(prefix = "spring.redis")
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Order(-1)
-public class RedisProperties {
-    private String host;
-    private Integer port;
-    private String password;
-    /**
-     * 默认30天 = 2592000s
-     */
-    private Integer expire = 2592000;
-
-}

+ 5 - 3
src/main/java/com/usky/config/shiro/MyRealm.java

@@ -17,6 +17,7 @@ import org.apache.shiro.util.ByteSource;
 import org.apache.shiro.util.SimpleByteSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -25,16 +26,17 @@ import java.util.Set;
 /**
  * @author laowo
  */
+@Component
 public class MyRealm extends AuthorizingRealm {
 
     @Autowired
- //   @Lazy
+    @Lazy
     private LoginService loginService;
     @Autowired
-  //  @Lazy
+    @Lazy
     private UserService userService;
     @Autowired
- //   @Lazy
+    @Lazy
     private MenuService menuService;
     //获取权限信息的方法
     @Override

+ 0 - 21
src/main/java/com/usky/config/shiro/MyRedisCacheManager.java

@@ -1,21 +0,0 @@
-package com.usky.config.shiro;
-
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.apache.shiro.cache.CacheManager;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
-
-/**
- *
- * @author laowo
- */
-public class MyRedisCacheManager implements CacheManager {
-    @Autowired
-    private RedisTemplate redisTemplate;
-
-    @Override
-    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
-        return new ShiroRedisCache(name,redisTemplate);
-    }
-}

+ 178 - 89
src/main/java/com/usky/config/shiro/ShiroConfig.java

@@ -1,22 +1,26 @@
 package com.usky.config.shiro;
 
-import com.usky.config.redis.RedisProperties;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.authc.credential.CredentialsMatcher;
 import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
+import org.apache.shiro.mgt.DefaultSubjectDAO;
 import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
 import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.crazycake.shiro.IRedisManager;
 import org.crazycake.shiro.RedisCacheManager;
 import org.crazycake.shiro.RedisManager;
-import org.crazycake.shiro.RedisSessionDAO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
@@ -24,15 +28,129 @@ import java.util.Map;
  * @author laowo
  */
 @Configuration
-@Order(-1)
+@Slf4j
 public class ShiroConfig {
-    @Autowired
-    private RedisProperties redisProperties;
+//    @Resource
+//    private LettuceConnectionFactory lettuceConnectionFactory;
+//    @Bean
+//    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
+//        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+//        shiroFilterFactoryBean.setSecurityManager(securityManager);
+//        //登录
+//        shiroFilterFactoryBean.setLoginUrl("/sys/login");
+//        //控制 访问xx资源 需要xx权限
+//        Map<String, String> filterChainMap = new LinkedHashMap<>();
+//        //swagger接口权限 开放
+//        filterChainMap.put("/doc.html", "anon");
+//        filterChainMap.put("/webjars/**/**", "anon");
+//        filterChainMap.put("/swagger-ui.html", "anon");
+//        filterChainMap.put("/webjars/**", "anon");
+//        filterChainMap.put("/v2/**", "anon");
+//        filterChainMap.put("/swagger-resources/**", "anon");
+//        //退出
+//        filterChainMap.put("/logout", "logout");
+//        filterChainMap.put("/static/**", "anon");
+//        filterChainMap.put("/templates/**", "anon");
+//        //swagger接口权限 开放
+//        filterChainMap.put("/**", "authc");
+//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
+//        return shiroFilterFactoryBean;
+//    }
+//    @Bean(name = "securityManager")
+//    public SecurityManager securityManager(@Qualifier("myRealm") MyRealm myRealm) {
+//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+//        // 设置realm.
+//        securityManager.setRealm(myRealm);
+//        securityManager.setCacheManager(redisCacheManager());
+//        // 自定义session管理 使用redis
+//        securityManager.setSessionManager(sessionManager());
+//        return securityManager;
+//    }
+//    @Bean(name = "myRealm")
+//    public MyRealm shiroRealm(@Qualifier("credentialsMatcher") CredentialsMatcher credentialsMatcher) {
+//        MyRealm shiroRealm = new MyRealm();
+//        shiroRealm.setCredentialsMatcher(credentialsMatcher);
+//        return shiroRealm;
+//    }
+//    /**
+//     * 凭证匹配器
+//     * @return
+//     */
+//    @Bean
+//    public CredentialsMatcher credentialsMatcher() {
+//        HashedCredentialsMatcher hashedMatcher = new HashedCredentialsMatcher();
+//        hashedMatcher.setHashAlgorithmName("md5");
+////        hashedMatcher.setHashIterations(1);
+//        return hashedMatcher;
+//    }
+//    @Bean
+//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager) {
+//        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+//        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+//        return authorizationAttributeSourceAdvisor;
+//    }
+//
+//    /**
+//     * 配置shiro redisManager
+//     * @return
+//     */
+//    public RedisManager redisManager() {
+//        RedisManager redisManager = new RedisManager();
+//        redisManager.setHost("47.111.81.118:6379");
+//        redisManager.setDatabase(1);
+//        redisManager.setTimeout(0);
+//        redisManager.setPassword(redisProperties.getPassword());
+//        return redisManager;
+//    }
+//    /**
+//     * cacheManager 缓存 redis实现
+//     * 使用的是shiro-redis开源插件
+//     * @return
+//     */
+//    @Bean
+//    public RedisCacheManager redisCacheManager() {
+//        RedisCacheManager redisCacheManager = new RedisCacheManager();
+//        redisCacheManager.setRedisManager(redisManager());
+//        redisCacheManager.setPrincipalIdFieldName("userId");
+//        return redisCacheManager;
+//    }
+//    /**
+//     * RedisSessionDAO shiro sessionDao层的实现 通过redis
+//     * 使用的是shiro-redis开源插件
+//     */
+////    @Bean
+//    public RedisSessionDAO redisSessionDAO() {
+//        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
+//        redisSessionDAO.setRedisManager(redisManager());
+//        return redisSessionDAO;
+//    }
+//    /**
+//     * shiro session的管理
+//     */
+//    @Bean
+//    public DefaultWebSessionManager sessionManager() {
+//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+//        sessionManager.setGlobalSessionTimeout(redisProperties.getExpire());
+//        sessionManager.setSessionDAO(redisSessionDAO());
+//        return sessionManager;
+//    }
 
-    @Bean
-    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
+    @Resource
+    LettuceConnectionFactory lettuceConnectionFactory;
+
+    /**
+     * Filter Chain定义说明
+     * <p>
+     * 1、一个URL可以配置多个Filter,使用逗号分隔
+     * 2、当设置多个过滤器时,全部验证通过,才视为通过
+     * 3、部分过滤器可指定参数,如perms,roles
+     */
+    @Bean("shiroFilter")
+    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
         shiroFilterFactoryBean.setSecurityManager(securityManager);
+        // 拦截器
+        // 配置不会被拦截的链接 顺序判断
         //登录
         shiroFilterFactoryBean.setLoginUrl("/sys/login");
         //控制 访问xx资源 需要xx权限
@@ -54,27 +172,23 @@ public class ShiroConfig {
         return shiroFilterFactoryBean;
     }
 
-    @Bean(name = "securityManager")
-    public SecurityManager securityManager(@Qualifier("myRealm") MyRealm myRealm) {
+    @Bean("securityManager")
+    public DefaultWebSecurityManager securityManager(MyRealm myRealm) {
         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-        // 设置realm.
+        myRealm.setCredentialsMatcher(credentialsMatcher());
         securityManager.setRealm(myRealm);
+        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
+        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
+        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
+        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
+        securityManager.setSubjectDAO(subjectDAO);
+        //自定义缓存实现,使用redis
         securityManager.setCacheManager(redisCacheManager());
-        // 自定义session管理 使用redis
-        securityManager.setSessionManager(sessionManager());
         return securityManager;
     }
 
-    @Bean(name = "myRealm")
-    public MyRealm shiroRealm(@Qualifier("credentialsMatcher") CredentialsMatcher credentialsMatcher) {
-        MyRealm shiroRealm = new MyRealm();
-        shiroRealm.setCredentialsMatcher(credentialsMatcher);
-        return shiroRealm;
-    }
-
-    /**
+        /**
      * 凭证匹配器
-     *
      * @return
      */
     @Bean
@@ -86,89 +200,64 @@ public class ShiroConfig {
     }
 
 
-    @Bean
-    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager) {
-        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
-        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
-        return authorizationAttributeSourceAdvisor;
-    }
-
     /**
-     * 配置shiro redisManager
-     *
-     * @return
+     * 下面的代码是添加注解支持
      */
-    public RedisManager redisManager() {
-        RedisManager redisManager = new RedisManager();
-        redisManager.setHost("47.111.81.118:6379");
-        redisManager.setDatabase(1);
-        redisManager.setTimeout(0);
-        redisManager.setPassword(redisProperties.getPassword());
-        return redisManager;
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
+        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
+        defaultAdvisorAutoProxyCreator.setAdvisorBeanNamePrefix("_no_advisor");
+        return defaultAdvisorAutoProxyCreator;
+    }
+    @Bean
+    public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
+        advisor.setSecurityManager(securityManager);
+        return advisor;
     }
 
     /**
      * cacheManager 缓存 redis实现
      * 使用的是shiro-redis开源插件
      *
-     * @return
      */
-    @Bean
     public RedisCacheManager redisCacheManager() {
+        log.info("===============(1)创建缓存管理器RedisCacheManager");
         RedisCacheManager redisCacheManager = new RedisCacheManager();
         redisCacheManager.setRedisManager(redisManager());
+        //redis中针对不同用户缓存(此处的id需要对应user实体中的id字段,用于唯一标识)
+     //   redisCacheManager.setPrincipalIdFieldName("id");
         redisCacheManager.setPrincipalIdFieldName("userId");
+        //用户权限信息缓存时间
+        redisCacheManager.setExpire(200000);
         return redisCacheManager;
     }
 
-
     /**
-     * RedisSessionDAO shiro sessionDao层的实现 通过redis
+     * 配置shiro redisManager
      * 使用的是shiro-redis开源插件
-     */
-//    @Bean
-    public RedisSessionDAO redisSessionDAO() {
-        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
-        redisSessionDAO.setRedisManager(redisManager());
-        return redisSessionDAO;
-    }
-
-    /**
-     * shiro session的管理
+     *
      */
     @Bean
-    public DefaultWebSessionManager sessionManager() {
-        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
-        sessionManager.setGlobalSessionTimeout(redisProperties.getExpire());
-        sessionManager.setSessionDAO(redisSessionDAO());
-        return sessionManager;
+    public IRedisManager redisManager() {
+        log.info("===============(2)创建RedisManager,连接Redis..");
+        IRedisManager manager;
+        RedisManager redisManager = new RedisManager();
+        redisManager.setHost(lettuceConnectionFactory.getHostName());
+        redisManager.setPort(lettuceConnectionFactory.getPort());
+        redisManager.setDatabase(1);
+        redisManager.setTimeout(0);
+        if (!StringUtils.isEmpty(lettuceConnectionFactory.getPassword())) {
+            redisManager.setPassword(lettuceConnectionFactory.getPassword());
+        }
+        manager = redisManager;
+        return manager;
     }
-
-//    /**
-//     * cookie对象;
-//     *
-//     * @return
-//     */
-//    public SimpleCookie rememberMeCookie() {
-//        // 这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
-//        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
-//        // 记住我cookie生效时间30天 ,单位秒。 注释掉,默认永久不过期 2018-07-15
-//        simpleCookie.setMaxAge(redisProperties.getExpire());
-//        return simpleCookie;
-//    }
-//
-//    /**
-//     * cookie管理对象;记住我功能
-//     *
-//     * @return
-//     */
-//    public CookieRememberMeManager rememberMeManager() {
-//        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
-//        cookieRememberMeManager.setCookie(rememberMeCookie());
-//        //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
-//        cookieRememberMeManager.setCipherKey(Base64.decode("1QWLxg+NYmxraMoxAXu/Iw=="));
-//        return cookieRememberMeManager;
-//    }
-
-
 }

+ 0 - 224
src/main/java/com/usky/config/shiro/ShiroRedisCache.java

@@ -1,224 +0,0 @@
-package com.usky.config.shiro;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.springframework.data.redis.connection.RedisConnection;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
-import org.springframework.data.redis.serializer.RedisSerializer;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- *
- */
-public class ShiroRedisCache<K, V> implements Cache<K, V> {
-    private static Logger LOGGER = LogManager.getLogger(ShiroRedisCache.class);
-
-    /**
-     * key前缀
-     */
-    private static final String REDIS_SHIRO_CACHE_KEY_PREFIX = "shiro_cache_key_";
-
-    /**
-     * cache name
-     */
-    private String name;
-
-    /**
-     * jedis 连接工厂
-     */
-
-    private RedisTemplate redisTemplate;
-
-    /**
-     * 序列化工具
-     */
-    private RedisSerializer serializer = new JdkSerializationRedisSerializer();
-
-    /**
-     * 存储key的redis.list的key值
-     */
-    private String keyListKey;
-
-    private RedisConnection getConnection(){
-        return this.redisTemplate.getConnectionFactory().getConnection();
-    }
-
-    public ShiroRedisCache(String name,RedisTemplate redisTemplate) {
-        this.name = name;
-        this.redisTemplate = redisTemplate;
-        this.keyListKey = REDIS_SHIRO_CACHE_KEY_PREFIX + name;
-    }
-
-    @Override
-    public V get(K key) throws CacheException {
-        LOGGER.debug("shiro redis cache get.{} K={}", name, key);
-        RedisConnection redisConnection = null;
-        V result = null;
-        try {
-            redisConnection = getConnection();
-            result = (V) serializer.deserialize(redisConnection.get(serializer.serialize(generateKey(key))));
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache get exception. ", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public V put(K key, V value) throws CacheException {
-        LOGGER.debug("shiro redis cache put.{} K={} V={}", name, key, value);
-        RedisConnection redisConnection = null;
-        V result = null;
-        try {
-            redisConnection = getConnection();
-            result = (V) serializer.deserialize(redisConnection.get(serializer.serialize(generateKey(key))));
-
-            redisConnection.set(serializer.serialize(generateKey(key)), serializer.serialize(value));
-
-            redisConnection.lPush(serializer.serialize(keyListKey), serializer.serialize(generateKey(key)));
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache put exception. ", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public V remove(K key) throws CacheException {
-        LOGGER.debug("shiro redis cache remove.{} K={}", name, key);
-        RedisConnection redisConnection = null;
-        V result = null;
-        try {
-            redisConnection = getConnection();
-            result = (V) serializer.deserialize(redisConnection.get(serializer.serialize(generateKey(key))));
-
-            redisConnection.expireAt(serializer.serialize(generateKey(key)), 0);
-
-            redisConnection.lRem(serializer.serialize(keyListKey), 1, serializer.serialize(key));
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache remove exception. ", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public void clear() throws CacheException {
-        LOGGER.debug("shiro redis cache clear.{}", name);
-        RedisConnection redisConnection = null;
-        try {
-            redisConnection = getConnection();
-
-            Long length = redisConnection.lLen(serializer.serialize(keyListKey));
-            if (0 == length) {
-                return;
-            }
-
-            List<byte[]> keyList = redisConnection.lRange(serializer.serialize(keyListKey), 0, length - 1);
-            for (byte[] key : keyList) {
-                redisConnection.expireAt(key, 0);
-            }
-
-            redisConnection.expireAt(serializer.serialize(keyListKey), 0);
-            keyList.clear();
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache clear exception.", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-    }
-
-    @Override
-    public int size() {
-        LOGGER.debug("shiro redis cache size.{}", name);
-        RedisConnection redisConnection = null;
-        int length = 0;
-        try {
-            redisConnection = getConnection();
-            length = Math.toIntExact(redisConnection.lLen(serializer.serialize(keyListKey)));
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache size exception.", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-        return length;
-    }
-
-    @Override
-    public Set keys() {
-        LOGGER.debug("shiro redis cache keys.{}", name);
-        RedisConnection redisConnection = null;
-        Set resultSet = null;
-        try {
-            redisConnection = getConnection();
-
-            Long length = redisConnection.lLen(serializer.serialize(keyListKey));
-            if (0 == length) {
-                return resultSet;
-            }
-
-            List<byte[]> keyList = redisConnection.lRange(serializer.serialize(keyListKey), 0, length - 1);
-            resultSet = keyList.stream().map(bytes -> serializer.deserialize(bytes)).collect(Collectors.toSet());
-        } catch (Exception e) {
-            LOGGER.error("shiro redis cache keys exception.", e);
-        } finally {
-            if (null != redisConnection) {
-                redisConnection.close();
-            }
-        }
-        return resultSet;
-    }
-
-    @Override
-    public Collection values() {
-        RedisConnection redisConnection = getConnection();
-        Set keys = this.keys();
-
-        List<Object> values = new ArrayList<Object>();
-        for (Object key : keys) {
-            byte[] bytes = redisConnection.get(serializer.serialize(key));
-            values.add(serializer.deserialize(bytes));
-        }
-        return values;
-    }
-
-    /**
-     * 重组key
-     * 区别其他使用环境的key
-     *
-     * @param key
-     * @return
-     */
-    private String generateKey(K key) {
-        return REDIS_SHIRO_CACHE_KEY_PREFIX + name + "_" + key;
-    }
-
-    private byte[] getByteKey(K key) {
-        if (key instanceof String) {
-            String preKey = generateKey(key);
-            return preKey.getBytes();
-        }
-        return serializer.serialize(key);
-    }
-}

+ 7 - 2
src/main/resources/application.yml

@@ -3,12 +3,17 @@ server:
   port: 8085
 spring:
   redis:
+    database: 0
+    host: 47.111.81.118
     lettuce:
       pool:
-        max-active: 8
+        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+      shutdown-timeout: 100ms
     password: uskyredis
     port: 6379
-    host: 47.111.81.118
   jackson:
     time-zone: GMT+8
   application: