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

tit*_*u10 6 ajax jsf redirect omnifaces exceptionhandler

在OmniFaces中,FullAjaxExceptionHandler在找到要使用的正确错误页面之后,调用JSF运行时来构建视图并呈现它而不是包含AJAX调用的页面.

为什么这个?恕我直言,只是执行一个ExternalContext#redirect()?有没有具体的理由这样做?

我们正在编写基于FullAjaxExceptionHandler的自己的ExceptionHandler,并希望了解这种设计背后的原因.

Bal*_*usC 5

其主要目标FullAjaxExceptionHandler是让ajax请求期间的异常与非​​ajax请求期间的异常行为完全相同.开发人员必须能够跨两个条件重用错误页面,而不必担心实现错误页面时的情况.

在非ajax请求期间,重定向不是正常流的一部分.执行转发的默认<error-page>机制是web.xml显示错误页面,而不是重定向.如果执行了重定向,则所有错误页面请求属性(例如javax.servlet.error.exception将丢失并呈现为)null.此外,通常的做法是将错误页面放入其中/WEB-INF以防止最终用户能够直接访问(以及书签和共享)它们.重定向将要求它们可公开访问,这表明主要的设计问题(目标页面实际上是真正的错误页面吗?).

如果您确实需要在错误页面中执行重定向,则可以生成一个显式调用ExternalContext#redirect()并且不使用web.xml <error-page>机制的自定义异常处理程序,或者将<meta http-equiv="refresh" ...>错误页面的HTML头部添加到此处(此处为示例).

如果您确实打算在ViewExpiredException发生时重定向到某个登录页面,那么您应该意识到"用户未登录"和"会话/视图已过期"的情况之间存在很大差异.对于前者,您根本不应该捕获ViewExpiredException,而是使用一个简单的servlet过滤器,它会在FacesServlet调用之前检查用户是否已登录并相应地重定向.普通的身份验证框架(JAAS,Shiro,Spring Security等)也可以这样工作.

也可以看看:


归档时间:

查看次数:

1208 次

最近记录:

10 年,8 月 前