4

JAVA 用の Google App Engine (GAE) で Web アプリケーションを実行しています。サーブレット レイヤーでクライアントを認証していますが、すべての関数の引数を介してクライアント オブジェクトを渡すことなく、ビジネス レイヤーとデータ レイヤーでクライアント情報を利用できるようにしたいと考えています。

ThreadLocal を使用して「セッション」タイプのオブジェクトを設定することを検討しています。そうすれば、どの関数でも次のように言うことができます:

CurrentUser.getRoles();

これはこれを行う良い方法ですか、それとももっと受け入れられている解決策が他にありますか?

ありがとう!

4

3 に答える 3

3

これはおそらく機能し、非常に便利ですが、通常ThreadLocal、同様のユースケースでは s をできるだけ避けるようにしています。理由:

  • コードは、基になるコンテナーが異なるユーザーに対して異なるスレッドを使用するという事実に突然依存し始めます。java.lang.Threadコンテナーが NIO や異なるタイプのスレッド (たとえば、一部のエキゾチックな JVMにマップされない緑のスレッド) などを使用して開始する場合、運が悪くなります。

  • ThreadLocal使用後の片付けを忘れがちです。したがって、サーバーの使用率が急上昇し、ユーザーの 1 人が大量のデータを「キャッシュ」に入れると、RAM が不足する可能性があります。

  • リクエスト後にクリーンアップしないとThreadLocal、他のユーザーが同じスレッドにジャンプすると想定して、セキュリティの脆弱性が露呈する可能性があります。

  • 最後に、ThreadLocals はコンテキスト内のスレッドを完全に制御できる環境向けに設計されたと思いますが、この使用例はそれをはるかに超えています。

残念ながら、実行可能な代替案を提案するために GAE についてあまり知りません。申し訳ありません!

于 2010-05-16T21:19:34.710 に答える
1

ThreadLocalsは、そのような情報を格納するための完全に受け入れられた方法です。私たちのほかに、私はAlfrescoから彼らがそれをしていることも知っています。

于 2010-05-16T20:20:39.960 に答える
1

Spring と Spring Security の使用がうまくいく場合は、私が作成したコードをjappstartの一部として認証/承認に使用できます。この情報は、Spring Security を介して利用できます。

于 2010-05-17T18:38:30.447 に答える