2011-10-20 2 views
6

顔の動きを囲む質問があります。faces-redirectと戻るボタンにより、他のリンクが正しく動作しなくなる

したがって、特定のユーザーを読み込むためのリクエストパラメータを取るページがあります。このページには、クリックすると、暗黙のナビゲーションを使用して別のページにリダイレクトするcommandLinkのリストが表示されます。ユーザーは、 "preRenderView"内のメソッドを呼び出すことによってロードされます。

リダイレクト先のページには、ロードするケースを決定するためのリクエストパラメータもあります。ページはpreRenderViewも使用しています。

どちらのページにもビュースコープのBeanがあります。

これはすべて、押されているFIRSTリンクにとって素晴らしい機能です。最初のページは新しいURLにリダイレクトされ、ケースは期待どおりに読み込まれます。

ただし、ブラウザの戻るボタンをクリックして別のリンクをクリックすると、ページはリダイレクトされません。それは(代わりに)リフレッシュし、明らかにケースを買いません。

リフレッシュ後、リンクをクリックすると正しくリダイレ​​クトされます。

最初のページのBeanがセッションに残っていてもセッションの状態を悪用したくない場合は、これがすべて正常に機能しますが、このデータを保持する必要はないと思いますセッション。

バックボタンをクリックすると(ビューが再作成されるため)、ページが自動的にリロードされるように修正できますが、それが正しい解決策であるかどうかはわかりません。 (私はこれを強制する方法もありません)

誰にも提案はありますか?これはかなり一般的な使用例のようですが、私は本当に例を見つけることができませんでした。

ありがとうございます!

答えて

11

基本的に、ビューステートの保存方法を(デフォルト)serverに設定している間に、動的に生成されたJSFページをキャッシュしないようブラウザに指示する必要があります。ビューステートは、ビューの状態識別子を入力値として持つ、生成されたJSFページの形式の<input type="hidden" name="javax.faces.ViewState">フィールドによって追跡されます。ページを送信して別のページに移動すると、ビューの状態はサーバー側で破棄され、もう存在しません。ブラウザのキャッシュからページを戻すと、隠れた入力の値として古いビューの状態識別子が与えられます。サーバー側のビューステートが見つからないため、そのフォームの送信はまったく機能しません。

ブラウザのキャッシュではなく、新しいページをサーバから直接取得したいとします。それを行うには、ブラウザを伝えるためには、このようなFilterを作成:

@WebFilter(servletNames={"Faces Servlet"}) 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 

ビューステートを再作成してフォームのページをもたらすべきである戻るボタンをfullworthy HTTPリクエストを送信します。この方法適切なビュー状態の隠しフィールド値。

+5

あなたは神です。ありがとう。 – jjross

関連する問題