私はフレックス/LCDS スタックを持っていますが、ログアウト後にDuplicate HTTP Session
クライアントでエラーを受け取ることがよくあります (常にではありません)。
スタックの重要な事実は次のとおりです。
- フレックス クライアントには、アプリ内にログイン/ログアウト機能があります。ログアウト後にページが更新されません。(したがって、Flex アプリとその基盤
mx.messaging.FlexClient
は初期化されたままです) - ユーザーは複数のタブを開いている場合があります。
per-client-authentication
に設定されfalse
ています-SSO(CASとの統合)を実現しようとしているため、ユーザー原則はJSessionにバインドされています。- この問題は、メッセージングにロング ポーリングを使用している場合、および 2 つ (またはそれ以上) のタブが開いている場合に最も顕著になります。
- RTMP またはストリーミング チャネルを使用している場合、この問題を再現するのは非常に困難です。
- ユーザーは JSession にバインドされます。つまり、ユーザーが Tab1 にログインすると、Tab2 にログインします。
- ユーザーがいずれかのタブからログアウトすると、Jsession は無効になります。
問題の原因についての私の現在の理論は次のとおりです。
- Tab1 (T1) クライアント起動 -> 発行済み ClientId1 (C1) -> JSession1 (J1) 作成
- Tab2 (T2) クライアントを開始 -> ClientId2 (C2) を発行 -> J1 に参加
- T1 ログイン -> J1 影響なし
- T2 ログイン -> J1 影響なし
- T1 & T2 両方がサブスクライブし、ポーリングを開始します
amflongpolling
- T1 がログアウトを送信 -> J1 無効化 -> J2 作成
- T2 がポールを送信 (J1 に対して)
- T1 ログアウトが完了し、J2 で戻り、Cookie を更新します
最後の 2 つの呼び出しは競合を引き起こし、FlexClient
LCDS は が 2 つの JSession に関連しているように見えます。
その結果、次の行に沿ったエラーが受信されます。
Server.Processing.DuplicateSessionDetected 重複した HTTP ベースの FlexSession が検出されました。これは通常、リモート ホストがセッション Cookie を無効にしていることが原因です。クライアント接続を正しく管理するには、セッション Cookie を有効にする必要があります。
注: スタンドアロン プロジェクトで問題を再現できました。 アプリケーション固有のコードの問題ではなく、ステートフル/セッションの性質と、同じセッションを共有する複数のタブ間の競合が原因であると思います。
要約すると、1 つのタブからの呼び出しの結果としてサーバー上でセッションが無効になっているが、新しい JSession を通知する応答がブラウザに送信される前に、古い Jsession で呼び出しが発行されるという問題が発生していると考えられます。 .
この重複セッションの問題を防ぐための適切な戦略は何ですか?
アップデート
明確にするために、シナリオはここで説明したものと似ていますが、その記事のソリューションを不適切にする微妙な違いがあります。
具体的には、この記事では、JSP またはオーケストレーションされた RemoteObject 呼び出しを使用して、両方のブラウザーで JSessionの初期作成を制御することにより、セッションの重複を防止する方法について説明しています。
DSid
Flexは、最初のセッションが確立されたことを示すローカル FlexClient 変数が定義されるまで、アウトバウンド RemoteObject 呼び出しを防止することで、実際にこのプロセスを支援します。
私のシナリオは異なります。なぜなら、JSession (および関連する LCDS FlexSession / クライアント側 FlexClient オブジェクト) は既に一度確立されており (その記事で説明されている手法を使用)、その後、ログアウトによって無効化されsession.invalidate()
、JSession を破棄するためです。
この問題は、Tab2 が古い JSession、重複 HTTP セッション エラーで呼び出しを送信したときに発生します。LCDS が DuplicateHTTPSession エラーをスローすると、クライアントに接続されているすべての既知の Jsession も無効になるため、状況は悪化します。次に Tab1 が呼び出しを送信すると、IT によって DuplicateHTTPSession エラーが発生し、サイクルが繰り返されます。
残念ながら、セッションが確立されている間に呼び出しを遅らせるための Flex フレームワークのフックには、一度設定すると再度有効にする簡単な方法がありません (私が見つけました)。(私は次のことを試しましたが、役に立ちませんでした:)
// Reset DSid to get a new FlexSession established on LCDS
use namespace mx_internal
public function resetFlexSession()
{
FlexClient.getInstance().id = null;
// Note - using FlexClient.NULL_ID also doesn't work.
}