gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:44:37 25 4
gpt4 key购买 nike

在OmniFaces中,FullAjaxExceptionHandler找到合适的错误页面后,调用JSF运行时来构建 View 并呈现它,而不是包含AJAX调用的页面。

为什么这个?恕我直言,仅执行ExternalContext#redirect()会更简单吗?有具体原因吗?

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

最佳答案

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头中(example here )。
如果您实际上打算在发生ViewExpiredException时重定向到某个登录页面,那么您应该意识到“用户未登录”和“ session / View 已过期”的情况之间存在很大差异。对于前者,您根本不应该捕获ViewExpiredException,而应使用一个简单的servlet filter来检查用户是否已登录并相应地重定向,很早就调用了FacesServlet。普通的身份验证框架(JAAS,Shiro,Spring Security等)也可以这样工作。
也可以看看:

  • What is the good approach to forward the exception from servlets to a jsp page?
  • What is the difference between redirect and navigation/forward and when to use what?
  • Why use a JSF ExceptionHandlerFactory instead of <error-page> redirection?
  • Check if session exists JSF
  • Authorization redirect on session expiration does not work on submitting a JSF form, page stays the same
  • 关于ajax - 为什么FullAjaxExceptionHandler不能简单地执行ExternalContext#redirect()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32602433/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com