Как получить параметры запроса в ExceptionHandler? - PullRequest
0 голосов
/ 02 февраля 2012

В нашем проекте ( 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).

1 Ответ

0 голосов
/ 02 февраля 2012

Параметры запроса доступны по ExternalContext#getRequestParameterMap().

Map<String, String> params = externalContext.getRequestParameterMap();
// ...

Или, если ваше приложение использует одно и то же имя параметра с несколькими значениями (что обычно имеет место для <h:selectManyXxx> компонентов), используйте ExternalContext#getRequestParameterValuesMap() вместо

Map<String, String[]> params = externalContext.getRequestParameterValuesMap();
// ...

Обратите внимание, что это возвращает только параметры текущего запроса, но не исходного запроса в случае обратных передач.

Что касается ExternalContext#getRequest(), то в случае JSF-приложений, работающих в контейнере сервлета, он возвращает экземпляр HttpServletRequest, который вам нужно будет разыграть, но вы редко должен иметь необходимость получить его. ExternalContext, следуя шаблону проектирования Фасада, имеет много методов, которые делегируют базовый необработанный HTTP-запрос сервлета, сеанс и контекст. В конечном итоге вы бы хотели получить ноль javax.servlet импорта в ваших бобах.


Обновление Согласно вашему комментарию, вы действительно хотите получить только те параметры просмотра, которые были зарегистрированы <f:viewParam>. Вы можете получить их по ViewMetadata#getViewParameters(), при этом вы передаете ток UIViewRoot.

Collection<UIViewParameter> viewParameters = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());
// ...
...