如何制作单例划分的对象螺纹安全(Guice + Owasp Esapi)
-
25-10-2019 - |
题
我目前正在使用OWASP ESAPI在Java Web应用程序中管理身份验证,并且我正在向Singleton myauthenticator注入guice.ijectMembers(this)。我想远离这种方法,并使用由GUICE创建的单例划分的对象。我喜欢Esapi Singleton的线程安全,以及通常使用双检查锁定,IODH IDIOM或BLOCH的ENUM实例样式的单身人士的安全性。
我需要对我的Guicified Singleton Scoped Authenticator做什么,以使其成为线程安全,以及我用来获取并设置当前用户的线程插座字段?
我想使整个应用程序使用依赖项注入,但不希望它突破Web应用程序并发访问。有什么建议还是常见的陷阱?
我正在使用的螺纹插座对象看起来像以下代码:
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) 除非 您将Singleton实例声明为“易挥发的".
不隶属于 StackOverflow