Неправильный сеанс определенного пользователя - PullRequest
2 голосов
/ 10 февраля 2012

Так что для моего веб-приложения, если я удаляю пользователя, который в данный момент вошел в систему, и я хочу сделать его / ее сеанс недействительным.Так что, как только он / она обновит страницу или перейдет, они больше не будут входить в систему. Теперь я имею в виду, что если пользователь успешно вошел в систему, я сохраню объект пользователя в моем бине SessionScoped и сохранюот HttpSession до Application Map.Ниже мой код

Это мой SessionScoped боб

@PostConstruct
public void init() {
    User user = UserDAO.findById(userId, password);
    Map<String, Object> appMap = FacesContext.getCurrentInstance().
             getExternalContext().getApplicationMap();
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().
             getExternalContext().getSession(false);
    appMap.put(userId, session);
}

Это правильный подход?Если да, то как мне очистить карту приложения?

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

Это правильный подход?

Есть в основном 2 способа.

  1. Сохранить HttpSessionобрабатывать в области приложения с помощью идентификатора пользователя в качестве ключа, чтобы вы могли получить его и сделать его недействительным.Это может работать для небольшого веб-приложения, работающего на одном сервере, но может не работать с веб-приложением, работающим на кластере серверов, в зависимости от его конфигурации.

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

  2. Добавить новый логический / битовый столбец в некоторую таблицу БД, связанную с пользователемкоторый проверяется на каждом HTTP-запросе.Если администратор установит его на true, то сеанс, связанный с запросом, будет признан недействительным, а значение в БД будет установлено обратно на false.


как очистить карту приложения?

Вы можете использовать HttpSessionListener#sessionDestroyed() для этого.Например,

public void sessionDestroyed(HttpSessionEvent event) {
    User user = (User) event.getSession().getAttribute("user");
    if (user != null) {
        Map<User, HttpSession> logins = (Map<User, HttpSession>) event.getSession().getServletContext().getAttribute("logins");
        logins.remove(user);
    }
}
2 голосов
/ 10 февраля 2012

Я думаю, что вы можете использовать свой подход (с некоторыми изменениями, предложенными @BalusC) плюс некоторый механизм уведомления (чтобы он работал в распределенной среде).Вы можете выполнить одно из следующих действий:

  1. Использовать очередь тем, подписанную всеми вашими серверами.Когда вы удаляете пользователя из вашей админ-панели, JMS сообщение будет создано и отправлено в тему.Каждый сервер будет нести ответственность за недействительность пользовательского сеанса, если он существует на конкретном сервере (если на сеанс ссылается карта servletContext).
  2. Реализуйте какое-либо действие, чтобы сделать недействительным пользовательский сеанс и выполнить это действие на каждом сервере вкластер (панель администратора должна отправлять HTTP-запрос на каждый сервер).
  3. Использовать надежную многоадресную рассылку JGroups и TCP.

Все эти решения не просты, но намного быстрее, чем опросСервер БД на каждый запрос.

...