2013-02-19 2 views
1

Я использую все функции FullAjaxExceptionHandler для перенаправления, когда какое-либо исключение запускается с помощью запроса ajax, в моем случае поймано ViewExpiredException.Перенаправление после обновления JSF Ajax (ViewRoot)

Я попытаюсь объяснить мой случай:?

1) У меня есть страница index.xhtml с CommandButton (AJAX запроса) о признании недействительной сессию и возвращает действие, как это «/ входа в систему лица переадресацией = истина».

2) Откройте index.xhtml два раза в том же браузере.

3) В первой index.xhtml нажмите на кнопку (сеанс недействительным и перенаправляется login.xhtml)

В этот момент принять во внимание, у меня есть собственный PhaseListener, чтобы проверить, является ли пользователь успешно протоколируется, login.xhtml для публичного доступа, но index.xhtml ограничен для авторизованных пользователей, web.xml для просмотра истек, и 403 ошибки:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/index.xhtml</location> 
</error-page> 
<error-page> 
    <error-code>403</error-code> 
    <location>/403.xhtml</location> 
</error-page> 

4) Перейти к второму index.xhtml (сессия аннулируется в этот момент), теперь нажмите кнопку, чтобы запустить исключение.

FullAjaxExceptionHandler улавливает ViewExpiredException и пытается отобразить index.xhtml, но в то же время мой фазелист проверяет, разрешен ли пользователь, например, сеанс был недействителен, пользователь не авторизовался и мой ответ FireListenerSendError (403) , но не показывает 403.xhtml, потому что это ajax-запрос.

Как я могу отправить 403 ошибку, чтобы показать 403.xhtml из моего PhaseListener? responseSendError отменяет нормальный процесс для FullAjaxExceptionHandler, в этот момент, когда это исключение не происходит, перенаправление происходит.

Кроме того, чтобы уточнить, когда истекает срок действия представления, мне нужно перенаправить на index.xhtml, потому что в процессе производства я использую CAS (Central Authentication Service).

ответ

1

Конкретная проблема по существу не связана с FullAjaxExceptionHandler. У вас все равно была бы такая же проблема, если вы ее не использовали. Это не представляется возможным использовать responseSendError() на AJAX запросов, по крайней мере, 2 причинам:

  1. Ответ Аякса должен иметь статус 200 для того, чтобы быть успешно обработаны.
  2. Ответ ajax должен представлять действительную структуру XML-структуры JSF ajax, а не обычную HTML-страницу.

Внутри PhaseListener, лучше всего использовать ExternalContext#redirect().

ExternalContext ec = context.getExternalContext(); 

if (context.getPartialViewContext().isAjaxRequest()) { 
    ec.redirect(ec.getRequestContextPath() + "/403.xhtml"); 
} else { 
    ec.responseSendError(403, "Unauthorized"); 
} 

Правда, это заканчивается в ответ HTTP 200, но это до сих пор лучшее, что вы можете получить, если вы хотите, чтобы показать страницу ошибки в полном объеме в случае АЯКС запроса.


Unrelated к конкретной проблеме, если ViewExpiredException будет брошен, то причина почти во всех случаях просроченных сессии. Было бы разумнее просто указать страницу ошибки на странице /login.xhtml, а не /index.xhtml.Или, по крайней мере, более удобный для пользователя, на какой-то странице /expired.xhtml с объяснением, почему конечный пользователь оказался там и каковы его варианты, а также некоторые ссылки.

+0

В этом случае мне нужно прочитать web.xml, чтобы настроить страницу с ошибкой. Я изменю свой код. Спасибо, Балус. – Kab

Смежные вопросы