0

我目前正在使用 Owasp ESAPI 来管理我的 java Web 应用程序中的身份验证,并且我正在使用 guice.injectMembers(this) 注入 Singleton MyAuthenticator。我想摆脱这种方法并使用 guice 创建的 Singleton-Scoped 对象。我喜欢 ESAPI 单例的线程安全性,以及一般的单例的安全性,使用双重检查锁定、IODH Idiom 或 Bloch 的 Enum INSTANCE 样式。

我需要对我的 Guicified Singleton-Scoped Authenticator 做些什么以使其成为线程安全的,以及我用来获取和设置当前用户的 ThreadLocal 字段?

我想让整个应用程序与依赖注入一起工作,但不希望它在 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);
    }
}
4

2 回答 2

0

不幸的是,我对 Owasp ESAPI 的了解还不够,无法给出具体的答案,但您可能会对 Guice 的 AOP 支持有所了解。您可以拦截类上的所有方法调用并提供您喜欢的任何并发行为。

http://code.google.com/p/google-guice/wiki/AOP

于 2012-02-21T16:12:29.137 回答
0

小心在 Java 中使用“双重检查锁定”模式。除非您将单例实例声明为“ volatile ”,否则此设计模式在 Java 中无法可靠地工作(例如,请参阅http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)。

于 2013-02-09T07:37:19.827 回答