Wywołanie akcji w momencie wygasania sesji (jeszcze przed jej usunięciem)

0

Cześć,

piszę pewną aplikację korzystającą z zewnętrznego systemu autentykacji użytkownika i jednym z głównych wymagań mojego klienta jest konieczność wylogowania użytkownika z mojej apki jak i ze wspomnianego systemu natychmiast po wygaśnięciu sesji (maxInactiveInterval == 600 sekund).
Zaimplementowałem zwykły SessionListener:


@WebListener
public class SessionListener implements HttpSessionListener {

    private static Logger logger = LoggerFactory.getLogger(SessionListener.class);

    @Override
    public void sessionCreated(HttpSessionEvent hse) {
        logger.info("Session: " + hse.getSession().getId());
        hse.getSession().setMaxInactiveInterval(600);

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent hse) {
            logger.info("Session: " +hse.getSession().getId() + "destroyed" );
            logoutFromExternalSystem(hse.getSession());
    }
.
.
.
}

Lecz

public void sessionDestroyed(HttpSessionEvent hse)

jest wywoływane od razu tylko wtedy kiedy sesja jest ubijana (kiedy użytkownik kliknie przycisk wyloguj)

request.getSession().invalidate();

Ale nie jest wywoływana natychmiast po wspomnianym timeoucie (600 sekund).
Szukam sposobu jak to rozwiązać.
Z góry dzięki za pomoc

1

Musisz to trochę inaczej obsłużyć, bo tu korzystasz z mechanizmu dostępnego w Javie EE (w webowej części).

Najpierw należy dodać sobie konfigurację beana do emitowania eventów w web.xml:

<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

A potem radośnie zaimplementować nasłuchiwanie:

@Component
public class SessionFuneralListener implements ApplicationListener<SessionDestroyedEvent> {
    @Override
    public void onApplicationEvent(SessionDestroyedEvent event) {
        // kboom
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1