FullAjaxExceptionHandler不重定向到Ajax请求的错误页面(FullAjaxE

2019-10-18 13:58发布

我知道有已经在这里很多问题在这个问题上,但几乎所有的人都建议增加以下代码,因为还有另一层“上面”,也就是将一个普通的重定向而不是做一个Ajax重定向FullAjaxExceptionHandler(见这类似的问题 ) :

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/>标签,我删除,因为我并不真的需要它。

Answer 1:

Ajax响应看起来完全没问题,它具有<update id="javax.faces.ViewRoot">包含整个错误页的文件,所以FullAjaxExceptionHandler适当做其工作。

您的具体问题更可能在客户端,甚至在错误页面文件本身引起的,Ajax响应已检索之后。 它是那么的JavaScript轮到解析Ajax响应,并相应地取代现有的HTML文档。 检查浏览器的JavaScript控制台应该给任何线索,在该步骤的问题。 在特定情况下,这个问题似乎是由嵌套引起CDATA围绕由呈现的内容块<h:outputScript>这又引起一个JavaScript解析错误。

不幸的是,我不能与任何钻嘴鱼科的版本在我手里已经重现该问题。 也许你在什么地方自定义/第三方脚本渲染谁负责并称CDATA块。 该脚本渲染器应该跳过CDATA块时PartialViewContext#isAjaxRequest()返回true 。 如果您仍然无法弄清楚,那么最好的办法是更换<h:outputScript>由一个普通的HTML <script>或者甚至完全取消它-因为你最终做到了。



Answer 2:

原来的问题很多年后,现在使用的Wildfly 15,JSF 2.3,OmniFaces 3.2,我偶然发现了一个类似的问题:从FullAjaxExceptionHandler在例外的情况下,一个Ajax调用期间畸形部分缓解。 原因是嵌套CDATA在响应,从而注释出响应的一部分,从而导致XML解析错误。 罪魁祸首似乎是JSF标签UI:调试。 我已删除的声明,现在它按预期工作。



文章来源: FullAjaxExceptionHandler does not redirect to error page for Ajax request