Как да проверите кога потребителят е излязъл по изтичане на сесията

Имам JSF уеб приложение на glassfish, използвайки j_security_check валидиране с jdbcRealm на glassfish, свързан към MSSQL db. Има ли някакъв начин да проверите например дали има активен bean с дадено потребителско име? Просто искам да покажа на уеб страницата кой е онлайн. Моите предположения:

  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 управляван bean с обхват на сесията, представляващ влезлия потребител.

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

@ManagedBean
@SessionScoped
public class YourUser {

    // ...

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

}

По този начин методът ще бъде извикан преди зърното да бъде унищожено при изтичане на сесията.

person BalusC    schedule 19.12.2011