Как проверить, когда пользователь вышел из системы по истечении сеанса - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть веб-приложение JSF на glassfish, использующее проверку j_security_check с jdbcRealm на glassfish, подключенном к базе данных MSSQL. Есть ли способ проверить, например, существует ли активный бин с данным именем пользователя? Я просто хочу отобразить на веб-странице, кто в сети. Мои догадки:

  1. сохранить переменную в базе данных и изменить ее при входе / выходе из системы. Проблема скорее возникает, если кто-то не вышел из системы, но его сеанс истекает. Чем у меня нет возможности проверить, вошел ли он в систему.
  2. сохранить булеву переменную в бине и изменить ее при входе / выходе из системы. Проблема как в предыдущей возможности.

Есть ли способ изменить такую ​​переменную, когда сессия истекает? Может быть, какой-то другой подход более распространен?

1 Ответ

2 голосов
/ 20 декабря 2011

Проблема скорее возникает, если кто-то не вышел из системы, но его сеанс истекает.Чем у меня нет возможности проверить, вошел ли он в систему.

У вас есть возможность реализовать HttpSessionListener:

@WebListener
public class YourUserSessionListener implements HttpSessionListener {

    @Override 
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        YourUser yourUser = event.getSession().getAttribute("yourUser");

        if (yourUser != null) {
            yourUser.logout(); // Update DB.
        }
    }

}

Где YourUser - это управляемый вами компонент JSF в рамках сеанса, представляющий вошедшего в систему пользователя.

Или, когда вы находитесь в JSF2 (как подтверждает история ваших вопросов), введите @PreDestroy в методе выхода из системы в управляемом компоненте JSF в рамках сеанса, представляющем зарегистрированного пользователя:

@ManagedBean
@SessionScoped
public class YourUser {

    // ...

    @PreDestroy
    public void logout() {
        // Update DB.
    }

}

Таким образом, метод будет вызван до того, как компонент будет уничтожен по истечении сеанса.

...