Spring会话数据Redis - 从Redis商店获取有效会话,当前用户

时间:2016-03-10 16:23:48

标签: java redis spring-data spring-session spring-data-redis

我的问题是,在分布式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
  3. 我尝试了它确实会返回有效的会话结果,但问题是我仍然需要知道使用此应用程序的所有当前有效用户名。 (我不知道如何使用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,只要给我所有当前登录的有效会话和当前用户。(根据上次访问时间)或类似的东西)。

    谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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