当前位置: 首页 > 面试题库 >

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

蔡默
2023-03-14
问题内容

在OmniFaces中,FullAjaxExceptionHandler找到正确的错误页面以使用后,将调用JSF运行时来构建视图并呈现它,而不是包含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头中添加一个。

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



 类似资料:
  • 问题内容: 我在MacOSX上使用Docker(带有Boot2Docker)。 我可以从Docker Hub运行映像。 但是,当我尝试像这样运行自己的映像之一时: 要么 要么 我得到: 我猜它找不到在容器中执行的bash二进制文件,但是为什么呢? 基本图像是 谢谢你的帮助。 阿什莉 问题答案: 您的图片基于不带bash外壳的busybox。它的确有外壳。 所以这不起作用: 但这确实是: 由于您的入

  • 问题内容: 请考虑以下来自Shiro 界面的API方法,但也可能存在于其他库中: 是的,即使是现在,仍然有一些库使用原始类型,可能是为了保留Java 1.5之前的兼容性? 如果我现在想将此方法与流或类似的可选项一起使用: 我收到有关未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 蚀: 类型安全:方法collect(Collector)属于原始类型Stream。泛型类型Stream 的

  • 考虑下面的API方法,它取自Shiro的接口,但也可能存在于其他库中: 是的,即使是现在,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?! 如果我现在想将此方法与流或选项一起使用,如下所示: 我收到一条关于未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 日食: 类型安全:收集(Collector)方法属于原始类型Stream javac: 注意:GenericsT

  • 首先,我发现了另外两条有类似问题的线索。问题在于,他们没有为字符串使用正确的等号,也没有为他们的特定问题正确设置if语句的格式。 在我的任务中,我需要创建一个名为“猪”的游戏,玩家与计算机对决,在掷骰子时先获得100分。如果玩家在一个回合中掷1,他们不会得到额外的分数。如果玩家掷两个1,那么他们将失去所有分数。我还没有对电脑的回合进行编码,只是专注于玩家。请告诉我我做错了什么。提前非常感谢。 我的

  • 在给vs的一般处理程序设置断点时,能给程序点入断点,后面浏览器执行程序断点变成白色圆圈,程序继续往下进行断点恢复原样,此过程中断点未执行,根本就没有进入调试 代码无问题,无报错,与数据库连接也正常,但是就是获取不到数据。 设置断点也无效,换了浏览器也没用,因为是别人的代码直接复制过来,也特别去把要求与源代码格式一致的复选框去掉了。 题目来源及自己的思路 相关代码 粘贴代码文本(请勿用截图) 你期待

  • 在我的应用程序中,我在menuitemclicked中添加了Observable方法,但当我点击它两次时,它仍然起作用。单次按压。方法不工作,但按钮工作良好,任何建议或方法中的任何更改。 fetch()中断; }