2016-03-10 50 views
7

我的問題是,在分佈式Web應用程序中,可以使用RedisOperationSessionRepository從Redis Store獲得有效會話。 (我的意思是我不想寫明確的代碼將其放入Redis存儲中,然後再讀取它,我想了解是否框架或庫提供該代碼)。春季會話數據Redis - 從Redis商店獲取有效會話,當前用戶

我知道春天Redis的是能夠恢復會話和服務器重新啓動也保存登錄會話是否仍然有效(因爲它是由Redis的支持)

一個我期待的是功能獲取當前在應用程序中的所有可能的登錄用戶。我知道SessionRegistryImpl和這種方法。但是我注意到這種方法不受Redis支持,並且在服務器重新啓動後,不會返回登錄用戶。

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

我可以嘗試的功能之一是Spring Session 1.1.0,Spring會話通過用戶名查找。

  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尋找活動的會話,但可能會導致性能問題。

我不確定自己是否清楚自己,但是我們不能告訴Redis使用Spring會話api的一些信息,只需給我所有有效會話及當前登錄的當前用戶。(基於上次訪問時間或類似的東西)。

謝謝

回答

0

Redis的基本上是一個key-value存儲,並且不提供這樣的查詢要素。

但是,您應該能夠使用KEYS請求列出所有會話,然後在最後一次活動的基礎上對其進行過濾,但會在您提到的github問題中提到缺點。

您應該考慮將用戶活動記錄在支持關係查詢的數據存儲中,並將Redis保留爲快速會話存儲。

+0

耶當前我正在使用KEYS列出所有會話,而且操作起來很昂貴。可能有一種選擇是在數據庫中存儲一個用於存儲用戶的標誌(如果他是登錄的),然後基於此標誌和用戶名,可以使用FindByUsernameSessionRepository。 –

+0

'KEYS *'是我一直在尋找的要求,以防萬一 – user1521567