2011-12-20 14 views
1

セキュリティのためにStripesとApache Shiroライブラリを使用するwebappがあります。同じセッションで新しいスレッドを作成するTomcat

私のローカルWindows Tomcat 6.0.33では、すべて正常に動作します。しかし、私のホストDailyRazorでLinux上のTomcat 6.0.16上でアプリケーションを実行すると、定期的にTomcatが同じユーザー/セッションの新しいスレッドを生成していることがわかります。そのため、ユーザーは資格情報を失い、ログインを求められます再び。

私はJettyの下で動作しているときに私のdevボックスにも気づきました。

webappに与えているヒットがシーケンシャルなので、非アクティブなタイムアウトの問題ではないと思います。Tomcatの設定には、マイナーバージョンとは別のものがあります。

また、(私のURLには表示されないので)セッション情報を簡単にデバッグする方法はありますか?それはコメントしていた場合よりもhttp://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSessionListener.html

+0

リクエスト処理の途中で新しいスレッドを開始しますか?あるいは、新しいリクエストを処理するために新しいスレッドを開始しますか?後者の場合、それは予想される。 ThreadLocalに資格情報を格納し、セッションで常に同じスレッドを使用することを願っていますか? –

+0

セッションIDを通常どおりログに記録してダンプすることはできますが、同じセッションであることはすでに分かっていると言えますが、どうやってそれを知っていますか?ユーザーのセッションは、任意の数のスレッドにわたって存在する可能性があります。 –

+0

@JBNizetリクエストが受信されたときにロギングしています。これは、同じブラウザウィンドウからのリクエストによって異なる場合があります。私はShiroがThreadLocalに資格情報を格納していると信じています。現在の主題を取得するための静的呼び出しがあります。セッションIDにスレッドが類似しているとは保証されませんか?既に答えを知っている –

答えて

-1

あなたはHttpSessionListenerのを使用することができます。 Tomcat(および他のアプリケーションサーバー)は、スレッドプールを使用し、プールからスレッドを選択し、要求を実行し、そのスレッドをプールに戻します。

HTTPセッションはスレッドと完全に直交しています。同じセッションからの複数の要求は、異なるスレッドによって処理される可能性があります。スレッドは、複数のセッションからの要求を実行します。通常、プール内のスレッドよりもはるかに多くの並列セッションが存在します。最後に、2つのスレッドが同じセッションに対して2つの要求を実行している可能性があります。これは、セッションに格納されたオブジェクトがスレッドセーフであること、またはセッションに格納されているスレッドセーフではないオブジェクトにアクセスするために同期メカニズムを使用する必要があることを意味します。

さらに、特定のブラウザの複数のフレームまたはタブは同じHTTPセッションを共有します。別のブラウザ(FirefoxなどのChrome)を起動したり、別のマシンでブラウザを使用したりすると、別のセッションになります。

+0

何をすればいいですか?それ自体は、これは答えではありません - 問題はセッション(明らかに)ではなく、スレッド化されています。 –

+0

セッションリスナーを使用すると、セッション情報をデバッグできます。 – hkn

3

はちょうどそれをより明確にするために:各HTTPリクエストは、任意のスレッドによって処理されます

+0

私はあなたのコメントであなたが言ったことからそれを考え出しました。私が問題から戻って誰かがTomcatのようなものを実装する方法を見れば、それは完璧な意味を持っています。答えをくれてありがとう、私は私のアプリケーションを裏返しにして、セキュリティのためにShiroサーブレットを使用して、Shiroをストライプインターセプタから呼び出すのではなく、その内部にストライプフレームワークを埋め込む方法を考え出します。 –

関連する問題