Обработка времени сеанса с Wicket - PullRequest
1 голос
/ 27 апреля 2020

Я работаю над устаревшим проектом калитки и пытаюсь исправить ошибку с тайм-аутом сессии. По сути, я хотел бы иметь перенаправление на обычную страницу ошибки после истечения времени сеанса. Вот что я сделал:

web. xml:

  <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

в классе приложения:

@Override
    public void init() {
        super.init();
        getApplicationSettings().setPageExpiredErrorPage(ErrorMessagePage.class);

Это не работает. Я имею в виду, что после сеанса ничего не происходит. Что я делаю не так?


РЕДАКТИРОВАТЬ 04.05.20

Основываясь на отзывах Мартина, я попытался внедрить средство проверки достоверности сеанса:

public class SessionValidityChecker implements IRequestCycleListener {

@Override
    public void onBeginRequest(RequestCycle cycle) {
        HttpServletRequest request = (HttpServletRequest) cycle.getRequest().getContainerRequest();

        boolean sessionValid = request.isRequestedSessionIdValid();
        if (!sessionValid) {
            cycle.setResponsePage(SessionExpiredPage.class);
        }
    }
}

и в Application.class

 public void init() {
        super.init();
        getRequestCycleListeners().add(new SessionValidityChecker());
}

Также, что я мог бы указать в своем первом посте, это то, что я использую калитку SignInPanel для аутентификации. После тайм-аута я бы хотел, чтобы пользователь вышел из системы и был перенаправлен на указанную c страницу.

Это то, что я пробовал с приведенным выше кодом, но после истечения времени сеанса перенаправление не происходит. Хуже того, пользователь все еще вошел в систему. Что мне не хватает?

1 Ответ

4 голосов
/ 27 апреля 2020

Вы ошибаетесь по истечении срока действия страницы по истечении срока сеанса. Страницы с состоянием хранятся в PageStore (на диске), и хранилище может вырасти до некоторого предопределенного размера. По достижении этого размера самая старая страница удаляется, чтобы освободить место для самой новой. Если в какой-то момент ваш пользователь многократно использует кнопку «Назад» в браузере, Wicket выдаст исключение PageExpiredException для удаленной страницы.

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

Если аутентификация отсутствует, Wicket создаст ее. новый экземпляр запрашиваемой страницы и его визуализации. Вы можете изменить это, изменив PageSettings#recreateBookmarkablePagesAfterExpiry на false (см. https://github.com/apache/wicket/blob/79f63f66eb588a5d69e9feff7066f1244f61f387/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java#L46)

Вы можете использовать javax / servlet / http / HttpServletRequest.html # isRequestedSessionIdValid () метод, чтобы найти поступил ли запрос с просроченным файлом cookie / URL-адресом JSESSIONID. Если это ложь, то веб-сервер только что создал новую HttpSession. Вы можете выполнить проверку в IRequestCycleListener Wicket # onBeginRequest ()

...