gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:30:09 24 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 已过期”的情况之间存在很大差异。对于前者,你不应该 catch 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/26588797/

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