Калитка: требуется двойной вход в систему из-за расширенной информации браузера

#java #wicket

Вопрос:

У меня есть приложение для калитки 8.6. В настоящее время при входе в приложение в основном (не всегда бывает) пользователю приходится входить дважды. После первого входа в систему (после ввода учетных данных и нажатия кнопки «Отправить») появляется белая страница с надписью » Если вы видите это, это означает, что как javascript, так и мета-обновление не поддерживаются конфигурацией вашего браузера. Пожалуйста, нажмите на эту ссылку, чтобы продолжить путь к первоначальному месту назначения». Это страница браузера. Через несколько секунд пользователь снова перенаправляется на страницу входа в систему, где он/она должен снова ввести свои учетные данные и нажать кнопку входа. На этот раз пользователь успешно вошел в систему. Мой вопрос в том, как мне предотвратить, чтобы пользователь дважды вводил свои учетные данные.

Из моих исследований я знаю, что это как-то связано со сбором расширенной информации о браузере. В методе инициализации моего класса WicketApplication у меня был следующий код:

 getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
 

Однако я уже прокомментировал этот код несколько месяцев назад. По какой-то причине описанный эффект возникает теперь при каждом новом развертывании. Возможно, причиной этого является недавно добавленный пакет в приложении. Я не знаю. Есть ли возможность предотвратить этот второй вход в систему, возможно, создав специальную информационную страницу боузера, которая перенаправляет вход в систему? Пожалуйста, укажи мне правильное направление. Спасибо.

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

1. Я не могу найти ни одного места в источнике Wicket (кроме примеров, включая wicketstuff), устанавливающего этот флаг. Пожалуйста, создайте краткое описание проблемы.

2. Спасибо вам за ваш ответ. Я провел еще некоторое тестирование и не смог воспроизвести его в своей локальной системе (за исключением случаев, когда я установил значение setGatherExtendedBrowserInfo равным true). Это происходит только на сервере и только при первом входе в систему. Таким образом, я не смог воспроизвести его в быстром старте. После некоторых исследований я придумал обходной путь (см. Мой ответ).

Ответ №1:

После некоторых исследований я придумал обходной путь. Возможно, это не очень эффективно, но пока это работает для меня. В моем пользовательском классе сеанса, который наследуется от AuthenticatedWebSession, я добавил следующий код.

     @Override
    protected WebPage newBrowserInfoPage() {
        final Request request = RequestCycle.get().getRequest();
        if(request.getUrl().toString().contains("LoginPage")) {
            if(!isSignedIn()) {
                signIn(username, password);
            }
            PageParametersEncoder encoder = new PageParametersEncoder();
            PageParameters parameters = encoder.decodePageParameters(request.getUrl());
            String url = parameters != null amp;amp; parameters.get("originUrl") !=null amp;amp; !parameters.get("originUrl").isNull() amp;amp; !parameters.get("originUrl").isEmpty()?
                    parameters.get("originUrl").toString("pages/home"):"pages/home";
            String finalUrl=url.startsWith("pages/")?url.substring("pages/".length()):url;
            throw new RedirectToUrlException(finalUrl);
        }
        return super.newBrowserInfoPage();
    }
 

Некоторое объяснение кода. Как упоминалось в вопросе, я хочу запретить пользователю входить в систему несколько раз. Таким образом, я проверяю, поступает ли запрос со страницы входа в систему, и выполняю свою работу только в этом случае.
Во время моей реализации я понял, что метод newBrowserInfoPage вызывается в процессе, когда я вызываю session.signIn(username,password); на моей странице входа в систему. В этом процессе входа в систему вызывается метод аутентификации моего пользовательского сеанса, но флаг signedIn в сеансе AuthenticatedWebSession не изменяется (сохраняет значение false при успешной аутентификации). Это ошибка? Таким образом, мне нужно снова войти в систему, чтобы установить флаг в значение true.
Наконец, я читаю URL-адрес страницы входа в систему, где я сохранил целевой URL-адрес, и перенаправляю пользователя на целевой URL-адрес.

Я понимаю, что это, вероятно, не лучший подход, но это единственное решение, которое я придумал. Если у кого-то есть идея получше, я рад ее услышать.