3

Omnifaces FullAjaxExceptionHandler ( http://showcase.omnifaces.org/exceptionhandlers/FullAjaxExceptionHandler ) に問題があります。セッションが無効化された後、指定されたエラー ページにリダイレクトされません。

私のfaces-configには次のものがあります:

<factory>
    <exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>

そして、私のweb.xmlには次のように書かれています:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/pages/error/viewExpired.html</location>
</error-page>

セッションを無効にした後、ユーザーの観点からは何も起こらないようです。アプリケーションは「死んでいる」だけです。私のコンソールには、次の Ajax リクエストが表示されます。

  • 応答コード 302 を含む元の Facelet ページへの POST
  • コード 200 でログイン ページへの GET (ただし、Ajax 経由で要求されるため何も起こりません)

WebLogic 12c で MyFaces 2.1.10、Primefaces 3.5、Primefaces Extension 0.6.3 & Omnifaces 1.4.1 を実行しています。

誰かが正しい方向に私を助けることができますか? FullAjaxExeptionHandler を正しく動作させるにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

応答コード 302 を含む元の Facelet ページへの POST

これは正しくないです。JSF ajax リクエストのリダイレクトには、属性<redirect>にターゲット URL を持つ要素を含む特別な XML レスポンスを持つレスポンス コード 200 が必要です。url

HttpServletResponse#sendRedirect()したがって、これは、JSF が処理する前に手動でどこかを使用したことを示していますViewExpiredException

おそらく、いくつかのセッション属性をチェックし、その存在/状態に基づいてリダイレクトを送信するサーブレットフィルターをどこかに持っていますか? そのフィルターは、次の回答に基づいて操作する必要があります: JSF フィルターは、JSF ajax 要求を認識し、302 応答ではなく特別な XML 応答を返すために、最初のリダイレクト後にリダイレクトしません。

例えば

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
    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 {
    response.sendRedirect(loginURL);
}

これはすべて、 とはまったく関係ありませんFullAjaxExceptionHandlerViewExpiredException事前にリダイレクトを送信しているため、JSF は a をスローする機会がありませんでした。

于 2013-04-16T12:06:29.250 に答える