为什么FullAjaxExceptionHandler不能简单地执行ExternalContext#redirect()?

6
在OmniFaces中,FullAjaxExceptionHandler找到正确的错误页面后,调用JSF运行时来构建并渲染视图,而不是包含AJAX调用的页面。
为什么这样做?我认为只需执行ExternalContext#redirect()可能更简单,这样做有特定的原因吗?
我们正在编写基于FullAjaxExceptionHandler的自己的ExceptionHandler,并希望了解此设计背后的原因。
1个回答

5
FullAjaxExceptionHandler 的主要目标是让 ajax 请求期间的异常与非 ajax 请求期间的异常完全相同。开发人员必须能够在实现错误页面时无需担心条件,从而跨两种情况重用错误页面。
在非 ajax 请求期间,重定向不是正常流程的一部分。web.xml 中的默认 <error-page> 机制执行转发以显示错误页面,而不是重定向。如果执行了重定向,则所有错误页面请求属性(如 javax.servlet.error.exception)将丢失并呈现为null。此外,通常做法是将错误页面放置在/WEB-INF中,以防止最终用户能够直接访问(并收藏和分享)它们。重定向将要求它们公开访问,这表示存在重大设计问题(目标页面是否实际上是一个真正的错误页面?)。
如果你确实需要执行从你的错误页面进行重定向/到你的错误页面进行重定向,那么请自定义异常处理程序,明确调用ExternalContext#redirect()并且不使用 web.xml 中的<error-page> 机制,或者在相关错误页面的 HTML head 中添加<meta http-equiv="refresh" ...>示例在这里)。
如果你实际上打算在ViewExpiredException发生时重定向到某个登录页面,则应该意识到“用户未登录”和“会话/视图已过期”的情况之间存在很大的差异。对于前者,你根本不应该捕获 ViewExpiredException,而是使用一个简单的servlet filter检查用户是否已登录并相应地进行重定向,远在 FacesServlet 调用之前。正常的身份验证框架(JAAS、Shiro、Spring Security 等)也是这样工作的。
另请参见:

感谢您的解释。 - titou10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接