#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.