Pregunta

Actualmente estoy usando el OWASP ESAPI para administrar la autenticación en mi aplicación web Java, y estoy inyectando el myautenticador Singleton con Guice.injectMembers (esto). Me gustaría alejarme de este enfoque y usar un objeto con calma singleton creado por Guice. Me gustó la seguridad del hilo del Singleton ESAPI, y la seguridad de los singletons en general, utilizando bloqueo de doble verificación, IODH Idiom o el estilo de instancia enum de Bloch.

¿Qué debo hacer con mi autenticador guiciificado con escollar singleton para que sea seguro de hilos, así como el campo de ThreadLocal que estoy usando para obtener y configurar mi usuario actual?

Me gustaría que toda la aplicación funcione con inyección de dependencia, pero no quiero que se rompa sobre el acceso concurrente de la aplicación web. ¿Alguna sugerencia o trampas comunes?

El objeto ThreadLocal que estoy usando se parece al siguiente código:

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);
    }
}
¿Fue útil?

Solución

Desafortunadamente, no sé lo suficiente sobre OWASP ESAPI para dar una respuesta específica, pero es posible que tenga suerte buscando el apoyo de AOP de Guice. Puede interceptar todas las invocaciones de métodos en la clase y proporcionar cualquier comportamiento de concurrencia que desee.

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

Otros consejos

Tenga cuidado con el patrón de "bloqueo de doble verificación" en Java. Este patrón de diseño no funciona de manera confiable en Java (por ejemplo, ver http://www.cs.umd.edu/~pugh/java/memorymodel/doublecheckedlocking.html) a no ser que Declaras la instancia de singleton como "volátil".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top