【问题标题】:Setting spring session on redis server在redis服务器上设置spring session
【发布时间】:2020-11-29 05:49:26
【问题描述】:

我正在使用 spring boot 编写我的 rest api。我正在尝试在 redis 服务器上维护用户的会话。 Redis 在默认端口6379 上启动并运行。我已经使用生菜罐连接到 redis 服务器。但似乎我的会话没有在 redis 服务器上设置。我尝试使用 uuid 获取会话对象集,它返回类似这样的内容

127.0.0.1:6379> get 02978830-2f35-47b7-a367-1f48e40d0ea0
(nil)

通过 redis cli,我可以设置和获取键值。

127.0.0.1:6379> set 123 123dummy
OK
127.0.0.1:6379> get 123
"123dummy"
127.0.0.1:6379> 

这是代码 sn-p,我试图根据他们的活动会话查看用户是否已登录,如果会话在那里,那么我将返回用户。否则我正在记录 em,然后在 redis 服务器上设置会话,然后返回用户。

UserAttributes findUserByEmailIdOrPhoneNumber(HttpServletRequest request,
      @RequestParam(value = "userLoginWay", required = false) String userLoginWay,
      @RequestParam(value = "userPassword", required = false) String userPassword,
      @RequestParam(value = "session", required = false) String session) {
    if(request.getSession().getAttribute(session) != null) {
        //we have session return user
        return user;
    } else {
        login(userLoginWay, userPassword)
        //set the session in redis here
        String sessionUuid = UUID.randomUUID().toString();
        request.getSession().setAttribute(sessionUuid, user);
        return user;
    }
}

这个用户是我试图设置为会话值和 uuid 作为键的对象。 这就是我尝试连接到redis服务器的方式

@Configuration
@EnableRedisHttpSession
public class SessionConfig extends AbstractHttpSessionApplicationInitializer {

    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory();
    }

}

这就是我在application.properties中所拥有的

#Configuring Redis server to manage sessions
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.port=6379

知道这有什么问题吗?

【问题讨论】:

    标签: spring spring-boot spring-mvc spring-security redis


    【解决方案1】:

    好的,所以我自己搞定了,我在会话配置类中做了一些更改,并通过扩展 AbstractHttpSessionApplicationInitializer 对其进行了初始化

    @EnableRedisHttpSession
    public class SessionConfig {
    
        @Bean
        public LettuceConnectionFactory connectionFactory() {
            return new LettuceConnectionFactory();
        }
    }
    

    通过扩展AbstractHttpSessionApplicationInitializer,确保名称为springSessionRepositoryFilter 的Spring Bean 对于每个请求都注册到我们的Servlet 容器中。更多信息请参考this

    public class SessionConfigInitializer extends AbstractHttpSessionApplicationInitializer {
    
        public SessionConfigInitializer() {
            super(SessionConfig.class);
        }
    }
    

    之后,当我查看 redis 服务器时,我可以看到类似这样的内容

    127.0.0.1:6379> keys '*'
    1) "spring:session:expirations:1597497540000"
    2) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:admin"
    3) "spring:session:sessions:expires:dc2172eb-2282-4600-9cd3-7f5d9bbb62b8"
    4) "spring:session:sessions:dc2172eb-2282-4600-9cd3-7f5d9bbb62b8"
    127.0.0.1:6379> 
    

    另一方面来自redis服务器,一旦你设置了你的会话,取决于你设置的值你需要检索它。 Redis 支持六种类型string, list, set, zset, hash and stream。在我的情况下,它是散列,因此查看命令的值将是 HGETALL <key>

    【讨论】:

      【解决方案2】:

      您必须使用其默认构造函数初始化与redis服务器的连接。

      return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
      
      1. 您可以使用@value 从属性文件中获取值,或者更好的方法是使用@ConfigurationProperties(prefix="spring.redis") 标记redis @configuration 类

      2. 添加字段字符串主机,具有各自getter和setter的int端口。

      【讨论】:

      • 您好 Vivkek,感谢您的来信。但我认为创建默认构造函数也会创建连接。如果你看一下 lettuce 类,它的默认值是 localhost 和端口 6379
      • 请查看 RedisStanalone 配置,它的默认主机和端口为 localhost:6379。 github.com/spring-projects/spring-data-redis/blob/…
      • 所以,如果你想使用默认值,那么你不需要在 application.properties 文件中添加属性并使用return new LettuceConnectionFactory(new RedisStandaloneConfiguration());创建会话
      • 是的,我已经删除了它们。您也可以使用return new LettuceConnectionFactory(); 创建连接
      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2021-09-13
      • 2018-06-25
      • 2019-02-12
      • 2021-03-22
      相关资源
      最近更新 更多