2016-03-10 3 views
7

Мой вопрос в том, что в распределенном веб-приложении можно получить действительные сеансы из Redis Store с помощью RedisOperationSessionRepository. (Я имею в виду, что я не хочу писать явный код для размещения его в магазине Redis, а затем читать позже, я хочу понять, предоставляет ли библиотека framework или spring-data-redis).Spring Session Data Redis - Получить действительные сеансы, текущий пользователь из Redis Store

Я знаю, что 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 и получать их, но я хочу знать, есть ли лучший подход).

Это часть кода, так я могу получить текущего пользователя от одного из многих пользователей, которые в настоящее время используют систему, если я знаю идентификатор сеанса.

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; 
      } 
     } 
    } 

Теперь я могу использовать выше логик, чтобы получить весь текущий пользователь, но опять же я все действительные сессии идентификаторы, которые я не знаю, как получить от Redis магазина.

Новое обновление: https://github.com/spring-projects/spring-session/issues/255 Вот в этой ссылке, я, вероятно, может получить все идентификаторы сессии и искать активных сессий в RedisOperationSessionRepository, но может привести к проблемам производительности.

Я не уверен, что я ясно дал понять, но не можем ли мы что-то сказать Редису, используя весеннюю сессию api, просто дайте мне все действующие сессии и их текущий пользователь, которые в настоящее время входят в систему. (На основе последнего доступа время или что-то в этом роде).

Благодарим вас

ответ

0

Redis в основном хранилище ключ-значение и не обеспечивает такие функции запросов.

Однако вы должны иметь возможность перечислить весь сеанс, используя запрос KEYS, а затем отфильтровать их на основе последней активности, но с недостатками, упомянутыми в упомянутой вами проблеме github.

Возможно, вам стоит рассмотреть возможность ведения журналов пользователей в хранилище данных, которое поддерживает реляционные запросы, сохраняя Redis в качестве быстрого хранилища сеансов.

+0

Да, в настоящее время я перечисляю все сеансы, используя KEYS, и это дорогостоящая операция. вероятно, одним из вариантов является наличие флага против пользователя в базе данных для хранения, если он входит в систему или нет, а затем на основе этого флага и имени пользователя можно использовать FindByUsernameSessionRepository. –

+0

'KEYS *' - это запрос, который я искал, на случай, если он поможет кому-либо – user1521567

Смежные вопросы