Почему RestartResponseException в окне исключений не перенаправляет на другую страницу?

#java #wicket

#java #калитка

Вопрос:

Я использую RestartResponseException в обработчике исключений (IRequestCycleListener) для перенаправления на странице входа в систему, и это не работает. Я вижу исключение в журналах, но никаких изменений в пользовательском интерфейсе.

         @Override
        public IRequestHandler onException(RequestCycle cycle, Exception ex) {
            if (couldNotLock) {
                getSessionStore().invalidate(cycle.getRequest());
                throw new RestartResponseException(LoginPage.class);
            }

            return null;
        }
 

Комментарии:

1. Каково фактическое поведение, когда оно не работает? Какую страницу вы видите? Вы видите ответ перенаправления (код состояния == 302) на вкладке DevTools> Network ?

2. Извините, я написал неправильно. Без аннулирования сеанса (только с RestartResponseException) страница обновляется с кодом 200, но не перенаправляется, я вижу ту же страницу, что и раньше. При аннулировании сеанса страница не обновляется, я не вижу никаких запросов в devtools. Я вижу страницу, как и раньше. Если я использую F5, я вижу страницу входа в систему, но это не перенаправление (по-прежнему нет запросов в devtools)

Ответ №1:

Даже с вашей дополнительной информацией в комментарии к вопросу все еще неясно, с какой проблемой вы сталкиваетесь.

Я попытаюсь угадать: ваша страница входа проверяет, вошел ли пользователь в систему, и просто перенаправляет на целевую / домашнюю страницу вашего приложения.

Чтобы исправить это, вам нужно аннулировать весь сеанс:

 @Override
public IRequestHandler onException(RequestCycle cycle, Exception ex) {
    if (couldNotLock) {
       Session.get().invalidate();    // !!!
       throw new RestartResponseException(LoginPage.class);
    }

    return null;
}
 

Комментарии:

1. Спасибо за ответ. Я попробовал и получил тот же результат, я все еще вижу домашнюю страницу, но после нажатия любой кнопки или обновления страницы с помощью F5 страница изменилась на страницу входа. Я ожидал получить страницу входа в систему без дополнительных действий, таких как нажатие или обновление. Я думаю, что RestartResponseException не работает, потому что я меняю его для эксперимента с NullPointerException и получил тот же результат, я заключаю, что изменение страницы было вызвано недействительностью сеанса.

Ответ №2:

Попробуйте выбросить new RestartResponseAtInterceptPageException(LoginPage.class) вместо RestartResponseException

Комментарии:

1. Спасибо за ответ. Я попробовал и не увидел никакой разницы с RestartResponseException. По-прежнему нет перенаправления.

Ответ №3:

Если больше ничего не помогает, вы можете изменить URL страницы с помощью javascript.

 @Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(JavaScriptHeaderItem.forScript("window.history.pushState("object or string", ""   pageTitle   "", ""   pageUrl   "")"));
}
 

для AJAX:

     AjaxRequestTarget target = optional.get();
    target.prependJavaScript("window.history.pushState("object or string", ""   pageTitle   "", ""   pageUrl   "")");
 

Комментарии:

1. Это интересная идея, но как реализовать ее в моем обработчике исключений (IRequestCycleListener)? Полагаю, я не могу.

2. Вы можете переопределить renderHead() в своем классе LoginPage, чтобы он всегда устанавливал правильный URL.