1

JSF 2 アプリケーションがあり、 で次のように構成しましたweb.xml

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

テスト目的で、セッションがすぐに期限切れになるようにするために@SessionScoped、 init メソッド内のクラスに次のコードをアノテーションで付けています。@PostConstruct

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
session.setMaxInactiveInterval(5);

今、私が持っているh:commandButtonoutcome = "somepage.jsf"、5秒後にクリックするとエラーページにリダイレクトされます。

代わりに Bean アクションを呼び出すか、action属性を使用してまったく同じボタンでページ名を実行するViewExpiredExceptionと、サーバーのログに が表示されますが、リダイレクトは発生しません。

どうしてこんなことに?また、セッションの有効期限が切れた後に行われたアクションに関係なく、一般的に別のページにリダイレクトする方法は?

4

1 に答える 1

1

非同期 (ajax) リクエストが送信されたため、動作が異なります。Ajax リクエストには特別な XML レスポンスが必要です。ajax リクエストの例外はjsf.ajax.addOnError、JavaScript のハンドラーまたはカスタムのいずれかで処理する必要がありますExceptionHandler

つまり、デフォルトでは、クライアント側に役立つフィードバックの単一の形式はありません。プロジェクト ステージが に設定されている Mojarra でのみDevelopment、例外メッセージを含む生の JavaScript アラート メッセージが表示されます。しかし、それだけです。Productionステージでのフィードバックの形式は 1 つではありません。

カスタムExceptionHandlerを使用すると、同期リクエストとまったく同じ形式のフィードバックをシミュレートできます。を解析しweb.xmlて適切なエラー ページの場所を見つけ、その周りに新しい を作成して、UIViewRootJSF に ajax レンダリングを に設定させることができ@allます。これは比較的かなりの作業であるため、JSF ユーティリティ ライブラリOmniFacesは、まさにそのような例外ハンドラをそのままの形で提供していますFullAjaxExceptionHandler。ショーケースページはこちらからご覧いただけます。

于 2012-11-20T01:46:08.670 に答える