4

HttpSessionsetAttribute メソッドと getAttribute メソッドがアトミックかどうかについて、多くの質問があります。ではない。request.getSession(true)しかし、クライアントごとのアトミックの実際の呼び出しはありますか?

たとえば、サーブレット フィルターがあり、クライアントが同時に回線に到達する 2 つの同時呼び出しを発行した場合request.getSession(true)、同じセッション オブジェクトが返されますか? そのようなことはコンテナ固有のものだと思いますか?getSessionまたは、要求しているクライアントごとに同期化された呼び出しを保証していますか。

4

3 に答える 3

6

いいえそうではありません。

サーブレット仕様によると...

2.3.3.4スレッドセーフstartAsyncメソッドとcompleteメソッドを除いて、要求オブジェクトと応答オブジェクトの実装はスレッドセーフであることが保証されていません。つまり、これらはリクエスト処理スレッドのスコープ内でのみ使用する必要があるか、アプリケーションはリクエストオブジェクトとレスポンスオブジェクトへのアクセスがスレッドセーフであることを確認する必要があります。

アプリケーションによって作成されたスレッドがリクエストオブジェクトやレスポンスオブジェクトなどのコンテナ管理オブジェクトを使用する場合、これらのオブジェクトには、セクション3.10および5.6で定義されているオブジェクトのライフサイクル内でのみアクセスする必要があります。startAsyncおよびcompleteメソッド以外では、要求オブジェクトと応答オブジェクトはスレッドセーフではないことに注意してください。これらのオブジェクトが複数のスレッドでアクセスされた場合は、アクセスを同期するか、ラッパーを介して実行して、スレッドセーフを追加する必要があります。たとえば、メソッドの呼び出しを同期して要求属性にアクセスするか、スレッド内の応答オブジェクトにローカル出力ストリームを使用します。

そしてあなたの質問に? getSessionへの2つの同時呼び出しが、同じクライアントからのものであっても、異なるHttpSessionオブジェクトを返す可能性はありますか? 答えは「はい、

  • 2つのセッションオブジェクトを返します。
  • 2つのSet-Cookieがクライアントに送信されます
  • 最新のSet-Cookieが最初のCookieを上書きする可能性があります
于 2013-01-03T13:34:21.713 に答える
1

ここで本当に心配していることがわからない:

たとえば、サーブレット フィルターがあり、クライアントが同時に回線に到達する 2 つの同時呼び出しを発行するとします。

request.getSession(true)

同じセッション オブジェクトが返されますか?

同じセッションオブジェクトが何を意味するかによって異なります。つまり、s1 == s2またはを意味する場合ですs1.equals(s2)。オブジェクトが同じでなければならない ( ==) という記述は見つかりませんが、それらがすべて異なるオブジェクトである可能性が高いとしても、最終的には同じ論理セッションを見ることができます。これらのセッション オブジェクトがデータベース クライアントであると想像してください。これらはデータではありませんが、すべて同じデータを表示します。つまり、共通の場所で読み取りと書き込みを行います。

ここで、あなたの質問に答えるために、同じサーバーからの他の応答を読み取る前に、クライアントが 2 番目の要求を発行したかどうかを判断する必要があります。セッションは、入力の一部 (URL または HTTP ヘッダーのいずれか) で追跡する必要があります。クッキーの形式)、したがって、次のシナリオがあります。

  1. クライアントはリクエスト #1 を行い、セッションを取得し、2 つの同時リクエスト #2 と #3 でセッション ID をサーバーに送り返します。これらはセッションを共有します。
  2. クライアントはリクエスト #1 と #2 をほぼ同時に行いますが、同じアプリケーションへの以前のリクエストはありません。サーバーに入力が提供されない (セッション ID がない) ため、クライアントが同時に getSession() 行にヒットしなくても、2 つの新しいセッションが作成されます。クライアント アプリケーションによっては、これがバグである場合とそうでない場合があります。

したがって、これはスレッドの問題ではありません。クライアントから提供された入力に依存するだけです。同じセッション ID、同じセッションが返されました。異なる (またはない) セッション ID、異なるセッション。

正確を期すために、論理クライアント (Firefox などの単一のプログラム) は、N+ コアのマシン上の N 個の個別のスレッドで N 個のリクエストを作成することもできますが、ネットワークは通常共有されます。マルチホーム マシンがあり、各 NIC が個別のネットワークに接続されていると仮定すると、複数の IP アドレスをリッスンし、N 個のプロセッサ (またはコア) を持つサーブレット コンテナーが必要になります。同じクライアントからのリクエストが並行して処理され、同時に同じ回線に到達する可能性は十分にありますが、2 つの同時呼び出しを行う必要はありません。

于 2013-01-03T14:00:38.117 に答える
0

メソッド内で何が起こっているのかわかりませんが、APIにはメソッドが同期されていることを示唆するものは何もありません。セッションgetSession(true)が存在しない場合は、新しいセッションが返されます。既存のセッションのチェックと新しいセッションの作成は、重要なセクションです。スレッドが同時に到達した場合、2 つのセッションが作成され、2 つの異なる呼び出しエンティティに返されます (フィルターはサーブレットの前に適用され、場合によってはサーブレットの後に適用されるため、これを行う方法はわかりませんが、質問のために、それが起こる可能性があると仮定しましょう)。オブジェクトが既に存在する場合は、そのSessionオブジェクトのみが返されます。

于 2013-01-03T14:19:35.200 に答える