Почему 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 и т. д.) Также работает таким образом.

Читайте также: