Я хочу выполнить настраиваемое событие, когда пользователь выходит из системы по истечении тайм-аута сеанса. Пользователь успешно вышел из системы по прошествии времени, указанного в моем application.properties:

server.servlet.session.timeout=10
server.servlet.session.cookie.max-age=10

Я нашел несколько подобных решений, которые включают SessionDestroyedEvent, например:

@Slf4j
@Component
public class SessionExpiredListener implements ApplicationListener<SessionDestroyedEvent> {

    @Override
    public void onApplicationEvent(SessionDestroyedEvent event) {
        for (SecurityContext securityContext : event.getSecurityContexts()) {
            Authentication authentication = securityContext.getAuthentication();
            UserPrincipal user = (UserPrincipal) authentication.getPrincipal(); // UserPrincipal is my custom Principal class
            log.debug("Session expired!" + user.getUsername());
            // do custom event handling
        }
    }
}

Проблема в том, что SessionDestroyedEvent не запускается одновременно с тайм-аутом сеанса, в моих тестах он сработал до 5 минут после истечения сеанса.

Я также пробовал использовать sessionDestroyed в HttpSessionListener, но с аналогичными результатами.

Есть ли событие, которое сработает точно по истечении сеанса, или есть какой-то способ этого добиться?

5
Spanner0jjm 5 Окт 2018 в 12:11

2 ответа

Лучший ответ

Метод sessionDestroyed() вызывается, когда веб-контейнер завершает сеанс. В Tomcat истечение срока действия сеанса происходит каждую минуту, и я думаю, что так обстоит дело с другими контейнерами сервлетов. Таким образом, даже после истечения времени сеанса может быть задержка до следующего обнаружения истечения срока действия.

Управление сеансом осуществляется контейнером сервлетов, и ваше приложение получает от него уведомление. И нет возможности получить уведомление о точном времени окончания сеанса.

2
user987339 5 Окт 2018 в 10:23

Я также обработал событие, когда пользователь вышел из системы по таймауту сеанса. Для меня это решение было полезным: https://stackoverflow.com/a/18128496/4074871

Кроме того, мне пришлось зарегистрировать HttpSessionEventPublisher, как указано в https://stackoverflow.com/a/24957247/4074871, потому что у меня нет web.xml для регистрации слушателя.

0
RoM 17 Июн 2020 в 09:11