0

JSF1.2 を使用して構築されたアプリケーションがあります。コマンドリンクのセットがあるホームページがあります。アプリケーションをデプロイした後、ホームページを開いてこれらのメニュー リンクのいずれかをクリックすると、以下の例外が発生します。ただし、他のページに移動してページに戻っていずれかのリンクをクリックすると、適切なページが開きます。

javax.faces.application.ViewExpiredException: viewId:/home/home.jsf - ビュー /home/home.jsf を復元できませんでした。

web.xml には以下のフィルターがあります -

 <filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    <init-param>
      <param-name>createTempFiles</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>maxRequestSize</param-name>
      <param-value>100000</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>
4

2 に答える 2

2

これは、ページがブラウザのキャッシュから実際にロードされた場合、または最初のリクエストの応答後に Web アプリケーションがどこかでセッションを無効にしている場合に発生する可能性があります。後者はやや変わったプログラミング アプローチであるため、ブラウザーのキャッシュにすぎないのではないかと思います。JSF リクエストをキャッシュしないようにブラウザに指示するには、フィルタを作成する必要があります。フィルタは にマップされ<servlet-name>、メソッドFacesServletで次のジョブを実行する必要があります。doFilter()

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse res = (HttpServletResponse) response;
    res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    res.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(request, response);
}

新しいフィルターで webapp をテストする前に、ブラウザーのキャッシュをクリアすることを忘れないでください。

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


具体的な問題とは関係ありませんが、大きな設計上の問題があります。コマンド リンクを使用してページ間のナビゲーションを実行しています。そこにはありません。フォームの送信にはコマンド リンクを使用します。ページ間のナビゲーションには、<h:outputLink>または通常の HTML要素を使用する必要があります。<a>このようにして、ページはブックマーク可能になり、検索ボットのインデックスが作成可能になり、ブラウザのアドレスバーの URL が「一歩遅れる」ことはなくなります。h:commandLink の代わりに h:outputLink を使用する必要がある場合も参照してください。

于 2012-04-03T13:44:50.303 に答える
1

これはバグではなく、JSF の機能です。これは、ページがしばらくアイドル状態になっているときに発生するため、ビューの有効期限が切れます。これには多くの回避策があります。この非常に優れた投稿を読んでみてください: JSF Odyssey – ViewExpiredException

それが役に立てば幸い。

于 2012-04-03T13:44:23.923 に答える