美文网首页
基于redis做分布式唯一登陆

基于redis做分布式唯一登陆

作者: Lolipiza | 来源:发表于2020-12-01 19:19 被阅读0次

    起因:

    公司的项目,发现某些模块虽然业务中使用到了:

    @Autowired
    private RedisTemplate redisTemplate;
    

    但是我本地配置文件都没有配置相关redis的配置,居然成功启动了,后来查了下发现redisTemplate的相关操作源码中都会去先调用excute方法:

    @Override
        public Boolean hasKey(K key) {
            byte[] rawKey = rawKey(key);
            return execute(connection -> connection.exists(rawKey), true);
        }
    

    所以都是使用的时候先连接再操作

    但是用户模块没有配置redis的相关参数却会报错,日志显示无法创建名为enableRedisKeyspaceNotificationsInitializer:

    [ERROR] 2020-12-01 11:21:19.425 [restartedMain] SpringApplication:Application run failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/boot/autoconfigure/session/RedisSessionConfiguration$SpringBootRedisHttpSessionConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; 
    

    后查看其他模块DEBUG启动日志发现关于:

    [DEBUG] 2020-12-01 10:21:02.067 [restartedMain] DefaultListableBeanFactory:Autowiring by type from bean name 'stringRedisTemplate' via factory method to bean named 'redisConnectionFactory'
    

    和用户模块的不一样:

    [DEBUG] 2020-12-01 11:21:05.910 [restartedMain] DefaultListableBeanFactory:Creating shared instance of singleton bean 'sessionRepository'
    

    查看源码发现这个bean

    package org.springframework.session.data.redis;
    
    /**
     * A {@link SessionRepository} implementation that uses Spring Data's
     * {@link RedisOperations} to store sessions is Redis.
     * <p>
     * This implementation does not support publishing of session events.
     *
     * @author Vedran Pavic
     * @since 2.2.0
     */
    public class RedisSessionRepository implements SessionRepository<RedisSessionRepository.RedisSession> {
    

    可见启动的时候会需要将session存入redis

    再看POM就可以确定是:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    

    的问题了,注释了这个依赖后,用户模块果然可以启动,但是为什么需要这个依赖呢?


    根据文章SpringBoot+SpringSession+Redis实现session共享及唯一登录,通过比较redis中存储的sessionId,确认是否唯一登录。

    但是我公司的项目使用了JWT,每次接口调用都会经过gateway,去判断JWT所携带的token和redis中存的是否相同,以此来实现单点登录,故不需要依赖spring-session-data-redis

    相关文章

      网友评论

          本文标题:基于redis做分布式唯一登陆

          本文链接:https://www.haomeiwen.com/subject/ndzjwktx.html