spring - 在 redis 服务器上设置 spring session

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

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

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> 

这是我尝试查看用户是否已登录的代码片段,具体取决于他们的事件 session ,如果 session 存在,那么我将返回用户。否则我正在记录 em,然后在 redis 服务器上设置 session ,然后返回用户。

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;
    }
}

这个用户是我试图设置为 session 值和 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

知道这有什么问题吗?

最佳答案

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

@EnableRedisHttpSession
public class SessionConfig {

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

通过扩展 AbstractHttpSessionApplicationInitializer , 确保 Spring Bean 的名称为 springSessionRepositoryFilter为每个请求在我们的 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 服务器,一旦你设置了你的 session ,根据你设置的值,你需要检索它。 Redis 支持六种类型 string, list, set, zset, hash and stream .在我的例子中,它是散列,所以要查看命令的值将是 HGETALL <key>

关于spring - 在 redis 服务器上设置 spring session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63326384/

相关文章:

java - Spring 启动 : accessDeniedHandler does not work

java - 如何在 Spring Boot 中使用 KMS 之前先解密 application.properties 中的密码

spring-boot - gradle bootRun 运行失败但在 IntelliJ 中运行成功

java - Spring MVC : the best way to handle exception for Ajax Request and normal request?

java - Spring Controller 将输出返回到 View 时出现错误

xml - JAXB 2 spring-ws 2.0.3.RELEASE SOAP 服务教程链接/建议请求

java - Spring 中的 XSD 客户端

java - org.springframework.expression.spel.SpelEvaluationException : EL1007E: Property or field 'xxxxx' cannot be found on null

java - 不满意的依赖异常 : Error creating bean with name 'trafficMapper'

java - 使用 Spring 和 Intellij 时无法解析 MVC View