1

この質問に関してここに多くの質問があることは知っていますが、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 出力コンソールのスクリーン キャップを添付します。JS 出力コンソール

問題が特定されました

エラー ページの HTML の形式が正しくないことが判明しました。次のスニペットが含まれているため、ブラウザでタグの不一致エラーが発生します。

<script type="text/javascript">
//<![CDATA[
scrollTo(0, 0);
//]]>
</script>

これにより、CDATA タグが時期尚早に閉じられたようです。この HTML は<h:outputScript/>タグの結果であり、実際には必要ないので削除しました。

4

2 に答える 2