シングルトンスコープオブジェクトスレッドセーフの作り方(guice + owasp esapi)
-
25-10-2019 - |
質問
現在、OWASP ESAPIを使用してJava Webアプリケーションで認証を管理しています。SingletonMyAuthenticatorにGuice.InjectMembers(This)を注入しています。このアプローチから離れて、Guiceが作成したSingletonスコープオブジェクトを使用したいと思います。私は、Esapi Singletonのスレッドセーフティと、ダブルチェックロック、ヨードイディオム、またはBlochのEnumインスタンススタイルを使用して、シングルトンの安全性が好きでした。
Guicified Singletonがスレッドセーフにするために、Guicified SingletonがスコープしたAuthenticatorに何をする必要がありますか?
アプリケーション全体を依存関係の注射で動作させたいと思いますが、Webアプリの同時アクセスで壊すことは望ましくありません。何か提案や一般的な落とし穴はありますか?
私が使用しているthreadlocalオブジェクトは、以下のコードのように見えます。
private final ThreadLocalUser currentUser = new ThreadLocalUser();
private class ThreadLocalUser extends InheritableThreadLocal<User> {
@Override
public User initialValue() {
return User.ANONYMOUS;
}
public User getUser() {
return super.get();
}
public void setUser(User newUser) {
super.set(newUser);
}
}
解決
残念ながら、OWASP ESAPIについて特定の答えを与えるのに十分な知識はありませんが、GuiceのAOPサポートを調べる運があるかもしれません。クラスでのすべてのメソッドの呼び出しを傍受し、好きな並行性の動作を提供できます。
他のヒント
Javaの「ダブルチェックロック」パターンを使用して注意してください。このデザインパターンはJavaでは確実に機能しません(たとえば、参照してください。 http://www.cs.umd.edu/~pugh/java/memorymodel/doublecheckedlocking.html) そうでもなければ あなたはシングルトンのインスタンスを」と宣言します揮発性".