Почему FullAjaxExceptionHandler не просто выполняет ExternalContext#redirect ()?
в OmniFaces,FullAjaxExceptionHandler, найдя правильную страницу ошибки для использования, вызывает среду выполнения JSF для создания представления и отображения его вместо страницы, которая включает вызов AJAX.
почему это? ИМХО было бы проще просто выполнить ExternalContext#redirect()
? Есть ли конкретные причины для этого?
мы пишем наш собственный ExceptionHandler на основе FullAjaxExceptionHandler и хотели бы понять причину этого дизайн.
1 ответов
основная цель FullAjaxExceptionHandler
позволяет исключениям во время ajax-запросов вести себя ровно то же самое, что и исключения во время не-ajax-запросов. Разработчик должен иметь возможность повторно использовать страницы ошибок в обоих условиях, не беспокоясь о состоянии при осуществлении страницы ошибок.
перенаправление не является частью нормального потока во время запросов, отличных от ajax. Значение по умолчанию <error-page>
механизм web.xml
выполняет переадресацию для отображения страницы ошибки, а не редиректа. Если перенаправление было выполнено, все атрибуты запроса страницы ошибок, такие как javax.servlet.error.exception
потеряется и отобразится как null
. Кроме того, обычной практикой является размещение страниц ошибок в /WEB-INF
предотвратить endusers от мочь сразу достигнуть (и закладки и делить) их. Перенаправление потребует их общедоступности, что указывает на серьезную проблему дизайна (является ли целевая страница на самом деле реальной страницей ошибок?).
Если вам действительно нужно выполнить перенаправление на странице ошибку, либо homegrow пользовательский обработчик исключений, который явно вызывает ExternalContext#redirect()
и не использовать web.xml
<error-page>
механизм, или добавить <meta http-equiv="refresh" ...>
к HTML-заголовку соответствующей страницы ошибок (пример).
в случае, если вы на самом деле намеревались перенаправить на страницу входа в систему, когда ViewExpiredException
происходит, то вы должны понимать, что есть большая разница между случаями "пользователь не вошел в систему" и "сеанс/просмотр истек". Для бывший, вы не должны ловить ViewExpiredException
вообще, но используйте простой сервлет фильтр который проверяет, вошел ли пользователь в систему и перенаправляет соответственно, задолго до FacesServlet
вызывается. Обычная структура аутентификации (JAAS, Shiro, Spring Security и т. д.) Также работает таким образом.
Читайте также:
- каков хороший подход для пересылки исключения из сервлетов на страницу jsp?
- что такое разница между перенаправлением и навигацией / вперед и когда использовать что?
- зачем использовать JSF ExceptionHandlerFactory вместо перенаправления
? - проверьте, существует ли сеанс JSF
- перенаправление авторизации по истечении сеанса не работает при отправке формы JSF, страница остается прежней