Вход на основе формы JSF 2.3 и исключение ViewExpiredException

У меня есть веб-приложение, развернутое в настоящее время на Wildfly 22, с использованием JSF 2.3 и OpenJDK 11. В настоящее время я переношу страницу входа с j_security_check на программный вход, следуя примеру BalusC в этом посте:

Выполнение аутентификации пользователя в Java EE / JSF с использованием j_security_check

Я не публикую код входа, потому что он в точности как сообщение BalusC.

Процесс входа в систему работает нормально, за исключением случаев, когда истекает время ожидания сеанса на странице входа. Другими словами, когда пользователь запрашивает защищенный ресурс, отображается страница входа в систему. Если сеанс истекает до того, как форма входа будет отправлена, выдается ViewExpiredException и пользователю предоставляется сообщение об ошибке.

Я понимаю, что это ожидаемое поведение, однако это не желаемая ситуация для конечного пользователя. Мне удалось минимизировать эту ситуацию с помощью ViewExpiredExceptionHandler OmniFaces. Таким образом, когда выдается ViewExpiredException, обработчик OmniFaces перехватывает его и перенаправляет на текущий URL-адрес со строкой запроса. Другими словами, пользователь пытается войти в систему после истечения сеанса, и страница входа снова отображается пользователю.

Мне удалось использовать #{flash['org.omnifaces.view_expired'] eq true}, чтобы пользователю было представлено приятное сообщение, объясняющее, что произошел тайм-аут.

Есть ли способ обойти эту ситуацию и выполнить успешный вход в систему даже по истечении сеанса, чтобы пользователю не приходилось дважды вводить свои учетные данные?

Спасибо за вашу помощь!


person areal    schedule 22.01.2021    source источник


Ответы (1)


Есть ли способ обойти эту ситуацию и выполнить успешный вход даже по истечении сеанса, чтобы пользователю не приходилось дважды вводить свои учетные данные?

Да, используя JSF без сохранения состояния, установив атрибут transient для <f:view> на true.

<f:view transient="true">
    <h:form>
        ...
        <h:commandButton ... action="#{requestScopedBean.login}" />
    </h:form>
</f:view>

Обратите внимание, что компонент поддержки должен быть @RequestScoped, а не @ViewScoped или шире.

Смотрите также:

person BalusC    schedule 22.01.2021
comment
Привет, я последовал вашим предложениям, и все сработало отлично. Затем я понял, что исходный URL-адрес не сохранялся по истечении тайм-аута сеанса, но это было решено простым открытием метода получения и установки и добавления ‹h: inputHidden value = # {loginController.originalURL} /› в xhtml. Большое спасибо! - person areal; 22.01.2021
comment
Пожалуйста. - person BalusC; 22.01.2021