繁体   English   中英

Spring Session Data Redis - 从 Redis Store 获取有效会话、当前用户

[英]Spring Session Data Redis - Get Valid Sessions, Current User from Redis Store

我的问题是,在分布式 Web 应用程序中,是否可以使用RedisOperationSessionRepository从 Redis Store 获取有效会话。 (我的意思是我不想编写显式代码将其放入 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 存储中获取这些 ID。

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

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

谢谢

Redis基本上是键值存储,并且不提供此类查询功能。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM