gpt4 book ai didi

ajax - FullAjaxExceptionHandler不会重定向到Ajax请求的错误页面

转载 作者:行者123 更新时间:2023-12-03 07:47:52 27 4
gpt4 key购买 nike

我知道这里有很多问题,但是几乎所有的人都建议添加以下代码,因为在FullAjaxExceptionHandler上方的另一层正在发送普通重定向而不是执行Ajax重定向(请参阅this similar question):

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
// JSF ajax request. Return special XML response which instructs JavaScript that it should in turn perform a redirect.
response.setContentType("text/xml");
response.getWriter()
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", loginURL);
} else {
// Normal request. Perform redirect as usual.
response.sendRedirect(loginURL);
}

我的问题是,我只是配置Omnifaces的FullAjaxExceptionHandler来执行所有错误处理,我没有Spring Security或容器管理的安全性在FullAjaxExceptionHandler能够做到这一点之前就拦截请求。我可以断点进入FullAjaxExceptionHandler并看到执行以下代码行时,我的错误页面仍未重定向。
String viewId = Faces.normalizeViewId(errorPageLocation);
ViewHandler viewHandler = context.getApplication().getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, viewId);
context.setViewRoot(viewRoot);
context.getPartialViewContext().setRenderAll(true);
...
context.renderResponse();

相反,产生异常的Ajax请求的响应主体中包含以下内容:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="javax.faces.ViewRoot"><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">... html of error page here ... </html>]]></update>
<update id="javax.faces.ViewState"><![CDATA[-3527653129719750158:5595502883804776498]]></update>
</changes>
</partial-response>

看来FullAjaxExceptionHandler并未执行应做的工作,还是我错过了什么?

更新

附加浏览器JS输出控制台屏幕盖。

问题已识别

原来我的错误页面的HTML格式不正确,其中包含以下代码段,这导致浏览器中的代码错误匹配:
<script type="text/javascript">
//<![CDATA[
scrollTo(0, 0);
//]]>
</script>

这似乎已经过早关闭了CDATA标签。该HTML是 <h:outputScript/>标记的结果,由于我确实不需要它,因此将其删除。

最佳答案

Ajax响应看起来完全正常,它包含一个包含整个错误页面文档的<update id="javax.faces.ViewRoot">,因此FullAjaxExceptionHandler可以正确完成其工作。

检索到ajax响应后,您的具体问题很可能是由客户端甚至是错误页面文档本身引起的。然后该轮到JavaScript来解析该ajax响应并相应地替换当前的HTML文档。检查浏览器的JavaScript控制台应提供有关该步骤中问题的任何线索。在您的特定情况下,问题似乎是由CDATA呈现的内容周围嵌套的<h:outputScript>块引起的,而这又导致了JavaScript解析错误。

不幸的是,我手头的任何Mojarra版本都无法重现该问题。也许您在某个自定义/第三方脚本渲染器的某个位置,负责添加该CDATA块。当CDATA返回PartialViewContext#isAjaxRequest()时,该脚本渲染器应跳过true块。如果仍然无法解决问题,那么最好的选择是用纯HTML的<h:outputScript>替换<script>,甚至完全删除它-最终如您所愿。

关于ajax - FullAjaxExceptionHandler不会重定向到Ajax请求的错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18597020/

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