В нашем проекте ( JBoss 7.0.2 , JSF 2 ) мы работаем над решением, позволяющим перехватывать все исключения во время навигации пользователя и перенаправлять их на страницы с сообщениями об ошибках.
Я использовал ExceptionHandler
, вдохновленный множеством примеров и учебных пособий онлайн.
Мне удалось выполнить функцию перенаправления без особых трудностей: в методе ExceptionHandler.handle()
, за некоторыми исключениями (просроченный просмотр / сеанс, неаутентифицированный пользователь запрашивает запрещенную страницу, ...) я перенаправляю пользователя на страницу входа через старый добрый
FacesContext.getCurrentInstance().getExternalContext().redirect(myRedirectPage);
с дополнительным параметром запроса, содержащим исходный URL base64 в кодировке, и после успешной аутентификации я использую тот же механизм перенаправления, чтобы отправить пользователя обратно на его страницу.
Проблема с ViewExpiredException
в действиях JSF, например, когда пользователь нажимает после того, как истек срок его просмотра на любой кнопке или ссылке с действием или actionListener, синхронным или в стиле ajax, как
<h:commandButton action="#{myBean.myAction}" value="do that" />
или
<h:commandLink value="do that too">
<f:ajax render=":aZone" execute="@form" listener="#{myBean.myOtherAction}" />
</h:commandLink>
Мне не удается получить параметры запроса в моем методе ExceptionHandler.handle()
.
Я пытался поместить свои параметры в секцию f:metadata
, например
<f:metadata>
<f:viewParam name="myParam" value="#{myBean.myParam}" />
</f:metadata>
и включить их в действие, поэтому в методе, связанном с действием кнопки, я вернул
"myPage.xhtml?includeViewParams=true"
но это ничего не изменило: - /
Я что-то не так делаю? Где я должен найти параметры запроса? Это в
FacesContext.getCurrentInstance().getExternalContext().getRequest()
** ОБНОВЛЕНИЕ **
Как сказано в комментариях, параметры представления больше не доступны после ViewExpiredException
(на самом деле это довольно очевидно), поэтому параметры должны храниться в другом месте (@BalusC быстро предлагается в области запроса или через cookie).