1

マシン上のJBoss AS 7.1の 2 つの異なるインスタンスを2 つの異なるポートで起動し、同じアプリケーションを (同じルート コンテキストで) 両方にデプロイしました。この構成では、同じブラウザー (Chrome、Firefox、または Conkeror のいずれか) でタブ ブラウジングを行っていたため、決定論的に次の例外が発生しました。

javax.servlet.ServletException: viewId:/whatever.xhtml - View /whatever.xhtml could not be restored.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)

さまざまなブラウザでブラウジングしていたときは問題ありませんでした。

さまざまなブラウザーが Cookie を保存する方法をさらに調査したところ、このようなタブ ブラウジングの問題を回避するには、組み合わせ ( IP /パス)を一意にする必要があり、ポートが機能しないことがわかりました。つまり、Cookie はIPごと、パスごとに保存されますが、ポートごとには保存されません。そのため、同じ IP とパス (ただし、明らかに別のポート) にデプロイされた 2 つの異なるアプリケーションで同じブラウザーを使用してタブ ブラウジングを行うと、ブラウザーが 2 つのセッションを混同するため、ビューが期限切れになります。私の設定が本番環境で発生する可能性は低いと認識していますが、質問したいと思います:

  1. この Cookie の整理動作を定義する標準はありますか?

  2. 複数の JSF アプリケーションでタブ ブラウジングを行う際に、セッションの混乱を避けるために知っておくべきベスト プラクティスはありますか?

  3. これに関係がありjavax.faces.STATE_SAVING_METHODますか(私の設定ではに設定されていました"server")?

4

1 に答える 1

3

この Cookie の整理動作を定義する標準はありますか?

バージョン 0 の Cookie ( Netscape仕様の Cookie) は、ポートをまったくサポートしていません。

バージョン 1 の Cookie ( RFC2965仕様の Cookie) はこのPort属性をサポートしています。これがない場合、バージョン 0 の動作が使用されます。

平均的な servletcontainer は、JSESSIONIDCookie をバージョン 0 の Cookie として設定します。サーブレットコンテナにカスタムの「セッションマネージャー」を提供することで、理論的にはこれをオーバーライドできます。MSIE 9 はまだバージョン 1 の Cookie をサポートしていないことに注意してください。


複数の JSF アプリケーションでタブ ブラウジングを行う際に、セッションの混乱を避けるために知っておくべきベスト プラクティスはありますか?

現実世界のプロジェクトで標準的なアプローチは、別のサブドメイン (同じポートで!) を使用することです。例: beta.example.comdev.example.comupdate.example.comtest.example.comなど。


これに関係がありjavax.faces.STATE_SAVING_METHODますか(私の設定ではに設定されていました"server")?

に設定すると、ビューがセッションに保存されなくなり、代わりにフォームの非表示フィールドに保存されるため、 は実際に消えますclientViewExpiredExceptionただし、セッション スコープのマネージド Bean やログイン ユーザーなど、いくつかのものをセッションに保存している場合は、他のセッション関連の問題に直面する可能性があります。

于 2012-09-03T12:00:55.763 に答える