0

私は次のような状況にいます:

  1. JSF (MyFaces 2.1.7 および RichFaces 3.3.3)
  2. セッション スコープ Bean TEST_PAGE
  3. BACKボタンを延々と使い続けるユーザー
  4. サーバーの状態保存

シナリオ:

  • ユーザーはリンクをクリックして、Session Scoped Bean (TEST_PAGE) を含むページに移動します
  • ユーザーが別のリンクをクリックする
  • ユーザーがブラウザの戻るボタンを押すと、TEST_PAGE に戻ります。
  • ユーザーがこのページで検索を試みる

多くの値があるため、バッキング Bean は検索時に例外をスローしnullます。その理由は、「検索」を押したときにページがRESTORE_VIEWフェーズにあるためです。

ユーザーが戻るボタンでページを更新するように強制するために、ページのキャッシュを無効にしてみましたが、多くのユーザーが「なぜ戻るボタンを使用できないのですか。以前はできたのに!」と不満を漏らしていました。アプリケーションが「フォーム再送信の確認」ページのクロム/IE/Firefoxショーでクラッシュしていると考えているため、ヘルプデスクチケットが発生したため、マネージャーは代替案を探すように求めています。

私の質問:

RESTORE_VIEW の現在の Phase_ID を検出し、例外を回避するためにこのフェーズで処理を行わないことは可能ですが、それだけで再調整するだけで、ユーザーは部分的なページ ビューを得ることができます。RENDER_RESPONSEこのシナリオにページを入れて処理を行うことは可能ですか? これにより、ページが更新されます。

質問パート2

推奨事項(または一般的/良い)の実践は、動的ページのキャッシュを無効にすることであるため、私はそうしましたが、頑固なユーザーを再教育する必要があります。

ただし、次の問題があります。

キャッシュが無効になっているページで [戻る] ボタンを押すと、ブラウザに「フォームの再送信の確認」(chrome) が表示され、ユーザーはこのボタンを押すRefresh / F5Enterキーを押すことができます。

Refresh/ F5がアクションの場合、RESTORE_VIEWフェーズを検出し、その PHASE での処理を回避し、処理をフェーズで実行できる場合はすべて問題ありませんRENDER_RESPONSE。ただし、Enterが押された場合、PhaseID は入ってRENDER_RESPONSE(6)いますが、いくつかのドロップダウン コントロールの値が null であるため、ページが失敗します。そのため、そのような状態を検出するチェックを入れ、FaceMessage を表示して、ユーザーにページを更新するように伝えます。

質問は、ユーザーに強制的に更新させる代わりに、強制的にページを更新させることはできますか? このページのナビゲーション ケースの形式は次のとおりです。

     <navigation-rule>
      <navigation-case>
       <from-outcome>/app/ord/r1</from-outcome>
       <to-view-id>/jsp/ordersHistory.jsp</to-view-id>
      </navigation-case>
     </navigation-rule>

faces-redirect=trueページを強制的にリロードするために使用されるコード スニペットをオンラインで見たことがありますが、それを機能させることができませんでした。助言がありますか?

4

1 に答える 1

5

動的ページでブラウザのキャッシュを無効にするのが最善の方法です。

この後に発生する新たな問題については、これは Web アプリケーションの設計が不十分であることが原因である可能性があります。Web アプリケーションを再設計して、POST の代わりに GET を使用してプレーンなページ間のナビゲーションを行います (つまり、の代わりに<h:link>またはのみを使用します)。応答を別のページに送信する必要がある POST 要求の POST-Redirect-GET パターンを実装するか、可能であれば ajax によって同じページに戻り、条件付きで結果を表示するように変更します。一部のフォームが GET フォームに適していないかどうかを確認します (たとえば、Google のような検索フォーム)。その Beanが本当にセッションスコープのものである必要があるかどうかを再考してください。通常、セッションスコープはログインユーザーとその設定のみに使用し、スコープデータのリクエストまたはビューには使用しません。<h:outputLink><h:commandLink>

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

于 2012-06-08T01:35:32.413 に答える