2016-12-05 15 views
0

アプリケーションの複数の負荷分散インスタンスを実行しているときにセッションの同時変更を防止できますか?スプリングセッション - セッションの同時変更を防止する

コンテキスト:複数のtomcats、すべて同じアプリケーションを実行しています。アプリケーションはSpringセッションを使用してセッションをRedisクラスタに格納します。ロードバランサは、着信要求を1つのtomcats(非粘着性)に配信します。ユーザーがボタンを押すと、Tomcat 1はリクエストを非常にゆっくり処理します(パフォーマンスの問題など)。ユーザーがもう一度ボタンを押すと、Tomcat 2ははるかに高速で、成功を返信します。ユーザーは次のページに進みます。 Tomcat 1は最初の要求を完了し、セッションを上書きします。すべての先行するページのデータは失われます。

解決策は、セッションをロックすることです。これにより、Tomcat 2は同時の変更を検出し、エラーで応答することができます(矛盾した状態を取得するよりはるかに良い)。

Thxをたくさん AB

答えて

0

これは、パフォーマンスの非常にマイナスの影響を与える可能性があるとして、春のセッションは、任意のセッションのロック機構を使用していません。あなたの例は単一の会話に焦点を当てていますが、ロックは同時に実行されることが完全に安全な多くのセッションに属するすべての要求に影響します。

例のシナリオでは、保護のために別のメカニズムを使用する必要があります。これは、アクションが完了するまでUI上のボタンを無効にし、その後の要求を防ぎ、サーバー側を変更するすべての要求を確実にするCSRF保護を使用するなどの単純な操作です。

Springセッションで提供されるほとんどのセッションリポジトリ実装では、競合条件を減らすことを目標とする書き込み操作の最適化が行われます。変更された属性のみを書き込みます。これは、基礎となるデータストアの性質が異なるため、セッションリポジトリごとに異なるため、選択したリポジトリのSessionRepository#save実装を確認してください。

多分、Spring Sessionは、リリース1.3.0(リリース候補フェーズでこの記事を書いている時点)からSpring Securityの同時セッション制御との統合を提供します。詳細についてはreference manualを確認できます。

+0

Thx多くのVedranいくつかの発言: ボタンを無効にしても、ユーザーは「F5」を押すか複数のブラウザーウィンドウを使用する可能性があるため、問題は解決しません。 セッションレポジトリで問題を処理するための適切なメカニズムが見つかりませんでした。とにかく、RedisOperationsSessionRepositoryは問題を解決しません。 CSRF保護トークンの使用は、同時の変更を検出する非常に興味深い考えです。私はそれを試してみましょう。 – user7252656

関連する問題