我知道有已经在这里很多问题在这个问题上,但几乎所有的人都建议增加以下代码,因为还有另一层“上面”,也就是将一个普通的重定向而不是做一个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/>
标签,我删除,因为我并不真的需要它。