同じドメイン上の 2 つの異なるステートフル ページを指す 2 つの iframe をデプロイすると、JSESSIONID が上書きされる可能性があるという私の理論を確認または反論する人を探しています。これが私が意味することです:
設定
- 正しく機能するために HttpSession 状態 (セッション アフィニティ) を必要とする 2 つのページがあり、 http: //www.foo.com/ page1 とhttp://www.foo.com/ page2 にデプロイされているとします。
- www.foo.com が、セッション ID に JSESSIONID を使用する Tomcat (6.0.20、fwiw) を実行している単一のホストであるとします。
- これらのページが 2 つの iframe ウィジェットに変換され、サード パーティのサイトに埋め込まれているとします: http://www.site.com/page1" /> (およびそれぞれ /page2)
- http://wwwの同じページに両方のウィジェットを配置したいサードパーティのサイトがあるとします。bar.com/foowidgets.html _
次の競合状態が発生する可能性はありますか?
- 新しい訪問者はhttp://www.bar.com/foowidgets.htmlにアクセスします
- ブラウザーは、2 つの iframe 'src' URL を含む foowidgets.html の URL の読み込みを開始します。
- ブラウザーは同じホストに対して複数の同時接続を開くため (chrome/ff の場合は最大 6 つ)、ブラウザーはたまたまhttp://www.foo.com/page1と http://www.foo.comの要求を同時に発行します。 /ページ2
- tomcat @ foo.com はほぼ同時に両方のリクエストを受け取り、(2 つの異なるスレッドで) getSession() を初めて呼び出し、2 つの HttpSession を遅延して作成します。また、リクエストはそれぞれのセッションにデータを詰め込みます (そのデータは後続のリクエストを処理するために必要になります)
- ブラウザが最初に page1 リクエストへのレスポンスを受信すると仮定します。ブラウザーは、HOST www.foo.com の Cookie JSESSIONID=$Page1 を設定します。
- page2 要求に対する次の応答が受信され、ブラウザー は HOST www.foo.com のCookie JSESSIONID を $Page2 で上書きします。
- ユーザーが foowidgets.html の「page1」iframe 内の何かをクリックします。ブラウザは http://www.foo.com/page1?action=doSomethingStatefulに 2 番目のリクエストを発行します。そのリクエストは JSESSIONID=$Page2 を運びます ($Page1 ではなく - Cookie の値が上書きされたため)
- foo.com がこのリクエストを受け取ると、間違った HttpSession インスタンスを検索します(JSESSIONID キーが $Page2 であり、$Page1 ではないため)。フーバー!
上記は起こりえますか?と思いますが、ご確認いただければ幸いです。
上記が明らかに可能である場合、ページごとに複数の iframe をサポートしたい場合、どのような解決策がありますか? iframe が同じ HttpSession を共有する必要はありませんが、それは良いことです。解決策が iframe ごとに別個の HttpSession を規定する場合、もちろん、iframe 1 が自分の代わりに iframe 2 の httpSession 状態を参照しないようにすることが必須です。
頭のてっぺんから次のことを考えることができます:
- page1 と page2 を異なるドメインにマップする (ops オーバーヘッド)
- URL 書き換えを使用し、Cookie を使用しない (分析を台無しにする)
- 他に何か?
どうもありがとう、ニキータ