Мой вопрос в том, что в распределенном веб-приложении можно получить действительные сеансы из 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.
- 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 и получать их, но я хочу знать, есть ли лучший подход).
Это часть кода, так я могу получить текущего пользователя от одного из многих пользователей, которые в настоящее время используют систему, если я знаю идентификатор сеанса.
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, просто дайте мне все действующие сессии и их текущий пользователь, которые в настоящее время входят в систему. (На основе последнего доступа время или что-то в этом роде).
Благодарим вас
Да, в настоящее время я перечисляю все сеансы, используя KEYS, и это дорогостоящая операция. вероятно, одним из вариантов является наличие флага против пользователя в базе данных для хранения, если он входит в систему или нет, а затем на основе этого флага и имени пользователя можно использовать FindByUsernameSessionRepository. –
'KEYS *' - это запрос, который я искал, на случай, если он поможет кому-либо – user1521567