2016-03-10 27 views
7

私の質問は、分散型Webアプリケーションでは、RedisOperationSessionRepositoryを使用してRedis Storeから有効なセッションを取得することが可能です。 (私はRedisストアに入れるための明示的なコードを書いておきたくないのですが、後でそれを読んで、フレームワークかspring-data-redisライブラリがそれを提供しているかどうかを理解したいと思います)。SpringセッションデータRedis - 有効なセッション、現在のユーザーをRedis Storeから取得

私は春のRedisのは、セッションやサーバーの再起動を復元することが可能であることを承知していたセッションがまだ有効である場合も、ログインを保存する(それはRedisのに裏打ちされたもの)

私が探していた機能のひとつがにあります現在アプリケーションにログインしているすべてのユーザーを取得します。私はSessionRegistryImplとこのメソッドを認識しています。この方法はRedisによってサポートされておらず、サーバーの再起動後もログインユーザーは返されません。

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

私が試してみることのできる機能の1つは、Spring Session 1.1.0、Spring session from 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

私が試した、それは確かに私に有効なセッションの結果を返しますが、問題は、私はまだ、このアプリケーションを使用しているすべての現在の有効なユーザー名を知っている必要があります。 (私はレディスストアを使ってそれらを手に入れる方法を知らないし、レディスに保管して入手することもできますが、より良いアプローチがあるかどうかを知りたい)。

これは、これは私がセッション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でアクティブなセッションを探しますが、パフォーマンスの問題につながる可能性があることができます。

私は明らかにしても分かりませんが、春のセッションAPIを使ってRedisに何かを伝えることはできません。現在有効なすべてのセッションと現在ログインしているユーザーを教えてください。時間など)。

答えて

0

Redisのは、基本的には、キーと値のストアであり、そのようなクエリ機能を提供していません、ありがとうございました。

しかし、KEYSリクエストを使用してすべてのセッションをリストし、最後のアクティビティベースでフィルタリングすることはできますが、前述のgithubの問題で言及されている欠点があります。

ユーザーアクティビティをリレーショナルクエリをサポートするデータストアに記録し、高速セッションストアとしてRedisを維持することを検討してください。

+0

現在、KEYSを使ってすべてのセッションをリストしていますが、これは高価な操作です。おそらく1つのオプションは、彼がログインしているかどうかを格納するためにデータベースのユーザに対してフラグを設定し、このフラグとユーザ名に基づいてFindByUsernameSessionRepositoryを使用することです。 –

+0

'KEYS *'は私が探していたリクエストです。 – user1521567

関連する問題