我目前正在使用Owasp ESAPI来管理我的java Web应用程序中的身份验证,我正在使用guice.injectMembers(this)注入Singleton MyAuthenticator。我想离开这种方法并使用guice创建的Singleton-Scoped对象。我喜欢ESAPI单身人士的线程安全,以及一般的单身人士的安全,使用Double-Checked Locking,IODH Idiom或Bloch的Enum INSTANCE风格。
我需要对Guicified Singleton-Scoped Authenticator做什么才能使其成为线程安全的,以及我用来获取和设置当前用户的ThreadLocal字段?
我想使整个应用程序与依赖注入一起工作,但不希望它破坏web-app并发访问。有任何建议或常见的陷阱吗?
我使用的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);
}
}
答案 0 :(得分:0)
不幸的是,我不太了解Owasp ESAPI给出的具体答案,但是你可能会对Guice的AOP支持有所了解。您可以拦截类上的所有方法调用,并提供您喜欢的任何并发行为。
答案 1 :(得分:0)
请注意在Java中使用“Double-Check Locking”模式。此设计模式在Java中无法可靠地工作(例如,请参阅http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html),除非您将单例实例声明为“ volatile ”。