0

セッション変数IDがあります。同じPC上の2つのブラウザーが同じセッション変数を共有して更新し、ランダムな結果を生成する可能性はありますか。私は、セッション変数の2つの別々のセットを持つ2つの別々のセッションが常に存在することを期待します。

私はこれを調査し、次のWebページに出くわしました。これは、これが発生しないようにするためのセッションロックがあることを示唆しています。http://odetocode.com/blogs/scott/archive/2006/05/20/session-state -uses-a-reader-writer-lock.aspx。ASP.NETアプリケーションがあり、これが発生している可能性があることを示唆するランダムな結果があります。

必要に応じてコードを作成します。

UPDATE 19:51 Tim Medoraは次のように述べています:「同じセッションIDを使用する同じブラウザタイプの2つのインスタンス」。これは、ユーザーが1つのブラウザーを開いてから閉じて(開くのに時間がかかりすぎるため)、別のブラウザーを(別のウィンドウで)開くと、同じセッションIDが使用され、ウィンドウ1のセッション変数がコピーされることを意味しますか?ウィンドウ2の場合?

UPDATE 19:35 24/10/2012 Tim Medoraは次のように述べています。「ただし、同じブラウザに2つのタブがあるか、同じセッションIDを使用する同じブラウザタイプの2つのインスタンスが存在する可能性は非常に高いです」。これらの場合、セッション情報は分離されますか?たとえば、ユーザーがブラウザを開いてから(応答が読み込まれる前に)閉じてから、異なるセッション変数のセットで同じウィンドウを開いた場合、セッションAとセッションBが同じセッション変数を持つリスクがあります。

4

2 に答える 2

0

ランダムな衝突の可能性は非常に低いです。

ただし、同じブラウザに2つのタブがあるか、同じセッションID1を使用する同じブラウザタイプの2つのインスタンスが存在する可能性が非常に高くなります。セッションIDも再利用される可能性があり、混乱を招きます。

これは、ユーザーが1つのブラウザーを開いてから閉じて(開くのに時間がかかりすぎるため)、別のブラウザーを(別のウィンドウで)開くと、同じセッションIDが使用され、ウィンドウ1のセッション変数がコピーされることを意味しますか?ウィンドウ2の場合?

はい、セッションIDを再利用でき、同じセッションがアクティブになっている可能性があります。Chromeで簡単な実験を行ったところ、URL(Sessionを使用)を新しいタブとブラウザーの新しいインスタンスにコピーすることができ、同じセッションがアクティブなままでした。

ただし、セッション変数は新しいウィンドウにコピーされません。それらは同じ値です。

セッションロック

セッションをロックするということは、2人のライターが同時にセッションを更新できないことを意味します。より具体的には、リクエストの開始からリクエストの終了まで、セッションにロックがかけられます。その期間中に変更できるのは1回の書き込みのみです。ただし、その期間は通常非常に短く、(ロックによって一部の問題が防止されますが)2つの異なるソースが異なる時間に同じデータを変更することを防ぐことはできません。

衝突の回避

衝突を最小限に抑える1つの方法は、一意のセッションキーを使用することです。(同じセッションの)ユーザーが編集のために2つの異なるレコードを開いたとします。「ActiveRecord」のセッションキーを使用している場合、データの破損/不一致の可能性は非常に高くなります。ただし、各ページが非表示フィールドに一意のキーを格納している場合は、その一意のキーを使用してSessionから適切な値を取得でき、各値を個別に操作できます。

つまり、一意のキーを使用すると、同じアイテムの2つの異なるインスタンスを同時に安全に開くことができます。これは、2つのウィンドウが同じアイテムを同時に編集する問題を防ぐことはできません。それらは別々のキーを持ちますが、データがコミットされたときに最終結果はおそらく望ましくありません。

1-これは最近のすべてのブラウザに当てはまるようですが、常に当てはまるとは言えません。参照を歓迎します。

于 2012-10-23T18:33:37.360 に答える
0

私は最近同様の状況に直面しました。ユーザーの作成画面では、ユーザーの複数のアドレスを入力できます。当初、私はアドレスを保存するためにセッションを使用しました。セッションはブラウザのタブ間で共有されるため、機能がうまく機能しませんでした。また、Webfarmシナリオでセッション状態を維持する際のオーバーヘッドなど、さまざまな理由により、セッションにデータを保存することは適切なアプローチではないことに気付きました。そのため、アドレスを保存するためにDOM操作(MVCアプリケーション以降)に戻す必要がありました。Webフォームの場合、ビューステートがセッションの代替になる可能性があります。

すでに投稿された回答で述べたように、リクエストごとに一意のキーを使用することでセッションを通じて実現できます。つまり、私の場合は、session [userid]にアドレスを保存するか、任意のランダムキーを使用して値を保持し、それを保持するための非表示フィールドを設定できます。 Webリクエスト全体のキー。ただし、ユーザーがタブを閉じたときに自動的にクリアされないという他の理由で私は確信していませんでした。

于 2012-10-23T19:12:24.100 に答える