58

私は現在 JSF を学んでいますが、 を使用するときはいつでも<h:form>、JSF の標準的な動作は、現在のページの URL とは対照的に、常にブラウザーにのページの URL を表示することであることに気付いたとき、かなり驚き、戸惑いました。

これは、JSFが常にフォームを同じページに投稿し、コントローラーがページの場所が変更されたことを知らないブラウザーに返すページをレンダリングする方法に関係していることを理解しています。

JSF は長い間存在しているように思われるので、これに対処するためのクリーンで確実な方法が必要です。もしそうなら、共有してもよろしいですか?

さまざまな回避策を見つけましたが、残念ながら、真の確実な解決策とは思えません。

  • URL が誤解を招くものであることをただ受け入れてください。
  • すべての Bean のアクション "?faces-redirect=true"の戻り値に追加してから
    • @RequestScoped他のもの (Flash スコープ、CDI 会話、@SessionScoped など)に置き換える方法を見つけます。
    • ユーザー アクションごとに 2 回の HTTP ラウンド トリップが発生することを受け入れます。
  • なんらかの方法 (サードパーティ ライブラリやカスタム コードなど) を使用して URL 内のページ名を非表示にし、すべてのページで常に同じ汎用 URL を使用します。

すべてのリクエストをこの"?faces-redirect=true"ように処理するようにアプリケーション全体を構成する方法はありますか?

4

1 に答える 1

88

<h:form>実際、MVC フレームワークをターゲットとするフォーム ベースのアプリケーションである JSF は、フォームが要求されたページとまったく同じ URL に POST フォームを送信します。<form action>生成された HTML 出力の URL を見ることで確認できます。これは、ポストバックとして特徴付けられる Web 開発用語です。ポストバックでのナビゲーションは、デフォルトでは新しい URL への新しいリクエストを発生させませんが、代わりにターゲット ページをレスポンスのコンテンツとして読み込みます。ページからページへのナビゲーションだけが必要な場合、これは確かに混乱を招きます。

一般に、ナビゲーション/リダイレクトに関する正しいアプローチは、ビジネス要件とリクエストの冪等性(「ブックマーク可能性」と読む) によって異なります (注: 具体的なコード例については、以下の「関連項目」リンクを参照してください)。

  • リクエストが冪等の場合は、POST フォームの代わりに GET フォーム/リンクを使用します (つまり、 andの代わり<a><form>、、<h:link>またはを使用します)。 たとえば、ページ間のナビゲーション、Google のような検索フォームなどです。<h:button><h:form><h:commandXxx>

  • リクエストが冪等でない場合は、結果を条件付きで同じビューに表示するだけです (つまり、アクション メソッドからnullorを返し、eg and/orを使用します)。 たとえば、ページ内データ入力/編集、マルチステップ ウィザード、モーダル ダイアログ、確認フォームなどです。void<h:message(s)>rendered

  • リクエストがべき等ではなく、ターゲット ページがべき等である場合は、POST の後にリダイレクトを送信するだけです (つまり、?faces-redirect=truefrom アクション メソッドで結果を返すか、手動で を呼び出すか、従来の XML ナビゲーション ケースExternalContext#redirect()に入れます)。 たとえば、編集が成功した後にすべてのデータのリストを表示したり、ログイン後にリダイレクトしたりします。<redirect/>

通常、純粋なページ間のナビゲーションは冪等であることに注意してください。これは、多くの JSF スターターがそのためのコマンド リンク/ボタンを悪用して失敗し、後で URL が変更されないと文句を言う場所です。また、ナビゲーション ケースは、SEO/UX を考慮して開発された実際のアプリケーションではめったに使用されないことに注意してください。これは、多くの JSF チュートリアルが失敗し、読者にそうでないと信じ込ませてしまうところです。

また、POST の使用は GET よりも「安全」ではないことに注意してください。これは、要求パラメーターが URL ですぐに表示されないためです。それらは引き続き HTTP 要求本文に表示され、操作可能です。したがって、「セキュリティ」のために冪等リクエストに POST を優先する理由はまったくありません。本当のセキュリティは、HTTP の代わりに HTTPS を使用し、現在ログインしているユーザーがエンティティ X のクエリやエンティティ X の操作などを許可されているかどうかをビジネス サービス メソッドでチェックすることです。適切なセキュリティ フレームワークは、これに対する注釈を提供します。

以下も参照してください。

于 2013-03-20T12:05:48.207 に答える