この質問に関してここに多くの質問があることは知っていますが、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 を構成してすべてのエラー処理を行うだけで、FullAjaxExceptionHandler がそれを行う前にリクエストをインターセプトする Spring Security またはコンテナー管理のセキュリティがないことです。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/>
タグの結果であり、実際には必要ないので削除しました。