1

すべての要求がサーブレット スレッドによって処理されることはわかっていますが、1 つのユーザー セッションに対して 2 つの要求が 2 つの異なるスレッドによって処理される可能性はありますか?

上記の状況が実際に発生した場合、最初の要求処理スレッドによって格納されたスレッド ローカル変数は、2 番目の要求処理スレッドによって読み取られるのでしょうか?

最初のスレッドでSpring SecurityのSecurityContextHolder(スレッドローカル変数を使用する)にユーザー資格情報を保存すると、2番目のスレッドがユーザー資格情報にアクセスできなくなるのではないかと心配しています...

4

3 に答える 3

1

いいえ、1 つのリクエストが複数のスレッドによって処理されることはありません。実際に発生する可能性があるのは、1 つのスレッドで 2 つのリクエストを処理することです。これが、スレッド ローカル変数の使用に細心の注意を払う必要がある理由です。ただし、Spring フレームワークは信頼できます。正しく動作します。たとえば、スレッドローカルを使用するときにセッションまたはリクエスト ID を使用できるため、1 つのスレッドによって処理される 2 つのリクエストが混乱することはありません。

于 2013-02-20T09:22:36.600 に答える
1

すべての要求がサーブレット スレッドによって処理されることはわかっていますが、1 つのユーザー セッションに対して 2 つの要求が 2 つの異なるスレッドによって処理される可能性はありますか?

はい、可能です。

最初のスレッドでSpring SecurityのSecurityContextHolder(スレッドローカル変数を使用)にユーザー資格情報を保存すると、2番目のスレッドがユーザー資格情報にアクセスできなくなるのではないかと心配しています...

セキュリティは Spring によってリクエストごとに個別に確立されます。これを自分で処理する必要はありません。

于 2013-02-20T09:25:38.197 に答える
0

同じユーザーの2つの別々の要求は、(ほとんどの場合)2つの異なるスレッドによって処理されます。

Springが何をするのかはわかりませんが、サーブレットAPIは、ユーザーセッションに固有のデータを取得する方法を提供します(サーバーがセッションを追跡する方法は関係ありませんが、CookieとURLの書き換えを確認してください)。

ここで、スレッドローカル変数にユーザークレデンシャルを設定したい場合(これは、ThreadLocal疑似シングルトンが私が知っている最も便利なインジェクション方法であるため、珍しいことではありません)、ユーザーHttpSessionに保存します(これは、同じユーザーのすべてのリクエスト)、サーブレットフィルタを使用して、各リクエストの開始時にスレッドローカルに配置します。

これにより、状況が少し明確になることを願っています。最新のフレームワークを使用している場合でも、内部で何が起こっているのかを知る方が良いと思います:)

于 2013-02-20T09:41:06.660 に答える