redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

本文介绍了一个关于SpringBoot应用中Shiro整合Redis作为缓存时出现的授权失败问题,并详细分析了问题原因及解决方案,特别是RedisManager配置中的密码设置细节。

项目场景:

springboot2.x+shiro+redis实现简单认证和授权demo

问题描述:

在ShiroConfig配置文件中新增配置:

	//数据来自配置文件application.yml
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.password}")
    private String password;

    @Bean
    public RedisManager redisManager() {
        RedisManager redisManager = new RedisManager();
        redisManager.setHost(host);
        redisManager.setPort(port);
        redisManager.setPassword(password);
        redisManager.setTimeout(300000);
        return redisManager;
    }

    @Bean
    public RedisCacheManager redisCacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager();
        redisCacheManager.setRedisManager(redisManager());
        // 必须要设置主键名称,shiro-redis 插件用过这个缓存用户信息
        redisCacheManager.setPrincipalIdFieldName("userId");
        redisCacheManager.setExpire(200000);
        return redisCacheManager;
    }
    /**
     * 控制中心
     * @return
     */
    @Bean(value = "securityManager")
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //使用自定义认证器
        //securityManager.setAuthenticator(authenticator());
        //使用自定义授权器
        //securityManager.setAuthorizer(authorizer());
        securityManager.setRealm(shiroRealm());
        // 自定义session管理 使用redis
        //securityManager.setSessionManager(sessionManager());
        // 自定义缓存实现 使用redis
        securityManager.setCacheManager(redisCacheManager());
        return securityManager;
    }

application.yml文件

spring:
  datasource:
  	******
  #redis 配置
  redis:
    database: 0
    host: localhost
    jedis:
      pool:
        ## 连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        ## 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        ## 连接池中的最大空闲连接
        max-idle: 8
        ## 连接池中的最小空闲连接
        min-idle: 0
    password:
    port: 6379

原因分析:

在未整合redis缓存时,是可以授权的。整合之后就无法授权,说明是整合时的配置出现问题。可是检查许久也没有发现到底哪里出现问题。我就看啊看,测呀测,突然灵光一闪,
发现有个奇怪的点。
在这里插入图片描述
我有种预感,有可能是密码的问题。
在这里插入图片描述
索性就把密码去掉。
在这里插入图片描述
测试,竟然通过了。我擦嘞!!!
没想到还真是这个问题,我可真是个天才!

拓展

当然作为一名成熟的IT人员(自我感觉良好),我肯定要追根究底。分别测试如下情况:
启动时打断点:
在这里插入图片描述
发现得到password是个空串,既然空串不行,那null呢?测试结果如下:

redisManager.setPassword("");//有错
redisManager.setPassword(null);//无错

总结

现在有了结论,使用RedisManager管理redis时设置redisManager.setPassword
,如果Redis服务未设置密码,要使用null而不是"“空串。
具体原因,肯定是RedisManger内部管理的问题了。
就比如,你使用RedisStandaloneConfiguration管理redis时,使用”"空串也是没问题的。如下

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName(host);
        config.setPort(port);
        config.setPassword(password);//password = ""
        JedisConnectionFactory factory = new JedisConnectionFactory(config);
        return factory;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值