Отображать сообщение пользователю об истекшем сеансе при использовании ролей wicket-auth

Привет, мне не удалось решить следующую проблему в Wicket 6. *:

В нашем веб-приложении мы используем роли wicket-auth для управления аутентификацией / авторизацией. По истечении сеанса пользователь должен быть перенаправлен на страницу, заданную getApplicationSettings().setPageExpiredErrorPage(SomePage.class) при его следующем действии. Однако, если пользователь пытается получить доступ к странице, которая не позволяет гостям, он перенаправляется на страницу входа в систему, полностью пропуская PageExpiredPage.

У меня вопрос - как я могу отобразить «Сессия истекла». сообщение пользователю?

Помимо прочего, я пробовал session.info("message") во время onInvalidate фазы жизненного цикла сеанса, однако сообщение обратной связи затем отображается на первой странице после входа в систему (а не на странице входа в систему).

Спасибо за ваши ответы.


person Wabi    schedule 24.03.2014    source источник


Ответы (2)


Вы можете использовать RequestCycleListener для записи, когда бросается PageExpiredException.

public class ExceptionMapperListener extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        if (ex instanceof PageExpiredException) {
            // Record in session or request cycle
            // OR
            // Create a RenderPageRequestHandler yourself and add a page parameter
            // See DefaultExceptionMapper#internalMap(Exception)
        }
        return null;
    }
}

// In Application#init():
getRequestCycleListeners().add(new ExceptionMapperListener());

ОРИНАЛЬНЫЙ ОТВЕТ

(оставлено, потому что это все еще может помочь ...)

Я сам не пробовал, так как не использую wicket-auth-roles, но попробуйте переопределить метод AuthenticatedWebApplication#restartResponseAtSignInPage() примерно так:

if (isSessionExpired()) {
    PageParameters params = new PageParameters();
    params.add("showSessionExpired", true);
    throw new RestartResponseAtInterceptPageException(getSignInPageClass(), params);
} else {
    throw new RestartResponseAtInterceptPageException(getSignInPageClass());
}

А затем в SignInPageClass отобразите желаемое сообщение, если присутствует параметр showSessionExpired page.

Я не уверен, как вы реализуете isSessionExpired(), но, похоже, эта часть уже рассмотрена.

OR

В зависимости от того, как вы реализовали isSessionExpired(), возможно, вы могли бы сделать следующее в своем SignInPageClass:

if (sessionExpired()) {
    session.info("message")
}
person bernie    schedule 25.03.2014
comment
К сожалению, isSessionExpired() - это именно та часть, в которой я застрял. Я не могу сказать, является ли текущий сеанс только новым или новым после истечения срока предыдущего внутри класса AuthenticatedWebApplication. - person Wabi; 26.03.2014
comment
Думаю, ваше обновление направило меня на верный путь. Мне нужно реализовать onBeginRequest(RequestCycle cycle) из RequestCycleListener, где я могу проверить действительность запрошенного сеанса. Единственная проблема, которую мне все еще нужно понять, - это как отличить просроченный сеанс от намеренно аннулированного (например, когда пользователь выходит из системы). Я предоставлю дополнительную информацию после того, как решу ее. - person Wabi; 31.03.2014

После того, как bernie поставил меня на правильный путь, я в конце концов нашел решение проблемы:

Сначала необходимо переопределить RequestCycleListener:

public class SessionExpiredListener extends AbstractRequestCycleListener {
  public void onRequestHandlerResolved(RequestCycle cycle, IRequestHandler handler) {
    if (handler instanceof IPageRequestHandler) {
        IPageRequestHandler pageHandler = (IPageRequestHandler) handler;

        HttpServletRequest request = (HttpServletRequest) cycle.getRequest().getContainerRequest();

        //check whether the requested session has expired
        boolean expired = request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid();

        //check whether the requested page can be instantiated with the current session
        boolean authorized = Session.get().getAuthorizationStrategy().isInstantiationAuthorized(pageHandler.getPageClass());

        if (expired && !authorized) {
            throw new PageExpiredException("Session has expired!");
        }

    }
    super.onRequestHandlerResolved(cycle, handler);
  }
}

Проверка authorized предотвращает отображение сообщения об истечении срока сеанса при выходе из системы или при доступе к незащищенным страницам.

Наконец, вы должны зарегистрировать слушателя и PageRequestHandlerTracker в своем WebApplication:

getRequestCycleListeners().add(new SessionExpiredListener());
getRequestCycleListeners().add(new PageRequestHandlerTracker());
person Wabi    schedule 03.04.2014