ここで本当に心配していることがわからない:
たとえば、サーブレット フィルターがあり、クライアントが同時に回線に到達する 2 つの同時呼び出しを発行するとします。
request.getSession(true)
同じセッション オブジェクトが返されますか?
同じセッションオブジェクトが何を意味するかによって異なります。つまり、s1 == s2
またはを意味する場合ですs1.equals(s2)
。オブジェクトが同じでなければならない ( ==
) という記述は見つかりませんが、それらがすべて異なるオブジェクトである可能性が高いとしても、最終的には同じ論理セッションを見ることができます。これらのセッション オブジェクトがデータベース クライアントであると想像してください。これらはデータではありませんが、すべて同じデータを表示します。つまり、共通の場所で読み取りと書き込みを行います。
ここで、あなたの質問に答えるために、同じサーバーからの他の応答を読み取る前に、クライアントが 2 番目の要求を発行したかどうかを判断する必要があります。セッションは、入力の一部 (URL または HTTP ヘッダーのいずれか) で追跡する必要があります。クッキーの形式)、したがって、次のシナリオがあります。
- クライアントはリクエスト #1 を行い、セッションを取得し、2 つの同時リクエスト #2 と #3 でセッション ID をサーバーに送り返します。これらはセッションを共有します。
- クライアントはリクエスト #1 と #2 をほぼ同時に行いますが、同じアプリケーションへの以前のリクエストはありません。サーバーに入力が提供されない (セッション ID がない) ため、クライアントが同時に getSession() 行にヒットしなくても、2 つの新しいセッションが作成されます。クライアント アプリケーションによっては、これがバグである場合とそうでない場合があります。
したがって、これはスレッドの問題ではありません。クライアントから提供された入力に依存するだけです。同じセッション ID、同じセッションが返されました。異なる (またはない) セッション ID、異なるセッション。
正確を期すために、論理クライアント (Firefox などの単一のプログラム) は、N+ コアのマシン上の N 個の個別のスレッドで N 個のリクエストを作成することもできますが、ネットワークは通常共有されます。マルチホーム マシンがあり、各 NIC が個別のネットワークに接続されていると仮定すると、複数の IP アドレスをリッスンし、N 個のプロセッサ (またはコア) を持つサーブレット コンテナーが必要になります。同じクライアントからのリクエストが並行して処理され、同時に同じ回線に到達する可能性は十分にありますが、2 つの同時呼び出しを行う必要はありません。