11

我的问题是,在分布式 Web 应用程序中是否可以使用RedisOperationSessionRepository. (我的意思是我不想编写显式代码将其放入 Redis 存储然后再阅读它,我想了解框架或spring-data-redis库是否提供了它)。

我知道 Spring Redis 能够恢复会话,并且如果会话仍然有效(因为它由 Redis 支持),服务器重新启动也会保留登录

我正在寻找的功能之一是获取应用程序中当前所有可能的登录用户。我知道SessionRegistryImpl,和这种方法。但我注意到此方法不受 Redis 支持,并且在服务器重新启动后,不会返回登录用户。

 public List<Object> getAllPrincipals() {
    return new ArrayList<Object>(principals.keySet());
}

我可以尝试的功能之一是 Spring Session 1.1.0,Spring session find by username。

  1. http://docs.spring.io/spring-session/docs/1.1.0.M1/reference/html5/guides/findbyusername.html
  2. https://spring.io/blog/2015/11/17/spring-session-1-1-0-m1-released

我试过了,它确实返回了有效的会话结果,但问题是我仍然需要知道所有当前使用此应用程序的有效用户名。(我不知道如何使用 Redis Store 获取它们,我可以再次存储在 Redis 中并获取它们,但我想知道是否有更好的方法)。

这是一段代码,如果我知道会话 ID,这就是我可以从当前正在使用系统的众多用户之一获取当前用户的方式。

    final Session session = redisOperationsSessionRepository.getSession(sessionid);

    final Object obj = session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
    if (obj instanceof SecurityContext) {
        final SecurityContext context = (SecurityContext) obj;
        final Authentication authentication = context.getAuthentication();
        if (authentication != null) {
            final Object principal = authentication.getPrincipal();
            if (principal != null && principal instanceof CurrentUser) {
                return (CurrentUser) principal;
            }
        }
    }

现在我可以使用上述逻辑来获取所有当前用户,但我应该再次获取所有有效的会话 ID,我不知道如何从 Redis 存储中获取。

新更新: https ://github.com/spring-projects/spring-session/issues/255 在此链接中,我可能可以获取所有会话 ID 并在 中查找活动会话RedisOperationSessionRepository,但可能会导致性能问题。

我不确定我是否说清楚了,但是我们不能使用 spring session api 告诉 Redis 一些东西,只要给我所有有效的会话和他们当前登录的当前用户。(基于上次访问时间或类似的东西那)。

谢谢

4

2 回答 2

0

Redis 基本上是一个键值存储,不提供这样的查询功能。

但是,您应该能够使用KEYS请求列出所有会话,然后在最后一个活动的基础上过滤它们,但是在您提到的 github 问题中提到了缺点。

您可能应该考虑在支持关系查询的数据存储中记录用户活动,将 Redis 保留为快速会话存储。

于 2016-04-19T08:41:25.277 回答
0

如果您的密钥具有公共前缀或后缀,则使用redis-scan命令是访问数据的一种很好的非阻塞方式。KEYS 命令非常昂贵,尤其是在它迭代/获取的数据很大的情况下。并且不建议在生产系统中使用。

注意 - 我的回答只是一个简单的解决方法,只需对您的代码进行最小的更改,而不是您问题的确切答案。

于 2021-11-11T14:35:24.580 回答