我的问题是,在分布式 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。
- http://docs.spring.io/spring-session/docs/1.1.0.M1/reference/html5/guides/findbyusername.html
- 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 一些东西,只要给我所有有效的会话和他们当前登录的当前用户。(基于上次访问时间或类似的东西那)。
谢谢