Как отслеживать зарегистрированных пользователей с помощью JSF2 и Servlet 3

У меня есть страница входа JSF, использующая аутентификацию формы. Я вхожу в систему, вызывая HttpServletRequest.login(имя пользователя, пароль). Выход из системы выполняется путем сначала вызова ExternalContext.invalidateSession(), а затем вызова HttpServletRequest.logout() для текущего пользователя.

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

У меня есть две проблемы с этим подходом:

  1. Если пользователь, который уже вошел в систему, пытается снова войти в систему без предварительного выхода из системы, я хочу аннулировать существующий сеанс и выполнить некоторую очистку. Как получить доступ к сеансу для данного вошедшего в систему пользователя? Я также мог бы использовать эту функцию для принудительного выхода из системы некоторых пользователей.

  2. Если сеанс истекает (например, тайм-аут), я хочу удалить пользователя из списка вошедших в систему пользователей. Как прослушать истечение сеанса?


person Zak    schedule 22.10.2012    source источник


Ответы (1)


  1. Поддерживайте Map<User, HttpSession> logins в области приложения самостоятельно. Во время входа проверьте, не возвращает ли logins.put(user, session) null, а затем сделайте его недействительным.

  2. Пусть User реализует HttpSessionBindingListener и соответственно реализует valueUnbound(), чтобы он выполнял logins.remove(this). Или, если у вас нет контроля над User, вместо этого реализуйте HttpSessionListener#sessionDestroyed() для выполнения удаления.


Не связанный с конкретной проблемой, вызов HttpServletRequest#logout() не нужен, если вы уже аннулируете сеанс. Пользователь все равно привязан к сеансу.

person BalusC    schedule 22.10.2012
comment
Я думал о вашем ответе на первый вопрос, но надеялся на другое решение. Что касается второго вопроса, я попытаюсь реализовать HttpSessionListener#sessionDestroyed() и посмотрю, как все пойдет. Спасибо. - person Zak; 22.10.2012