Как проверить, когда пользователь вышел из системы по истечении сеанса

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

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

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


person xwhyz    schedule 19.12.2011    source источник
comment
почему бы не сделать логическое поле для онлайн в базе данных участников, а по истечении срока их сеанса установить для него значение false?   -  person Chris Brickhouse    schedule 20.12.2011
comment
Это то, что я рассматривал, но я не знаю, как проверить, истек ли чей-то сеанс, или как изменить переменную параллельно с таким истечением.   -  person xwhyz    schedule 20.12.2011


Ответы (1)


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

У вас есть возможность реализовать 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.
    }

}

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

person BalusC    schedule 19.12.2011