Utilizando JNDI para compartir objetos de sesión de servlet y datos en Tomcat

Durante las últimas semanas he estado buscando soluciones para compartir un objeto entre dos contextos / archivos de guerra. Hay varias formas de hacerlo y una de ellas es JNDI.

No estoy muy familiarizado con el JNDI utilizado en Tomcat, por lo que me gustaría aclarar algunas preguntas:

ásicamente, tengo una instancia de un objeto que proporcionaría los siguientes servicios a más de un contexto / aplicación

Compruebe que el usuario haya iniciado sesiónCompruebe que la sesión del usuario es válida Usuario de inicio de sesión: incluye el registro de los detalles de inicio de sesión Cerrar sesión usuario - Eliminar sesión

Cada aplicación llamará a este objeto para validar al usuario antes de que procese cualquier solicitud. Lo que no entiendo es cómo funcionaría el objeto si se almacena en JNDI. He visto algunos ejemplos de cómo se usa JNDI en Tomcat, pero el 99% de los ejemplos muestran cómo configurar una fuente de datos JDBC.

¿Cómo exactamente se inicializa el objeto en JNDI? Por ejemplo, la siguiente configuración de los documentos de Tomcat muestra la configuración de JDBC
<Resource name="jdbc/db1"
   auth="Container"
   type="oracle.jdbc.pool.OracleDataSource"
   driverClassName="oracle.jdbc.driver.OracleDriver"
   factory="oracle.jdbc.pool.OracleDataSourceFactory"
   url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db1"
   user="scott"
   password="tiger"
   maxActive="20"
   maxIdle="10"
   maxWait="-1">

¿Cómo haría algo similar en mi caso y, lo que es más importante, cómo inicializaría el objeto antes de colocarlo en el árbol JNDI? Una vez que está en el árbol JNDI, ¿cómo se actualiza?

Supongo que lo que estoy buscando es un ejemplo simple del uso de JNDI en Tomcat, pero no para conexiones de bases de datos, sino para objetos de tipo proveedor de servicio

He estado leyendo este tutorialhttp: //docs.oracle.com/javase/tutorial/jndi/ops/bind.htm pero se centra más en los directorios de nombres LDAP que realmente no ayudan.

Edita

Ok, encontré un ejemplo en el tutorial que mencioné anteriormente que muestra cómo "vincular" un objeto con el árbol JNDI.

class SerObj {
    public static void main(String[] args) {

    // Set up environment for creating initial context
        Hashtable<String, Object> env = new Hashtable<String, Object>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

    try {
        // Create the initial context
        Context ctx = new InitialContext(env);

        // Create object to be bound
        Button b = new Button("Push me");

        // Perform bind
        ctx.bind("cn=Button", b);

        // Check that it is bound
        Button b2 = (Button)ctx.lookup("cn=Button");
        System.out.println(b2);

        // Close the context when we're done
        ctx.close();
    } catch (NamingException e) {
        System.out.println("Operation failed: " + e);
    }
    }
}
¿Cómo lo modificaría para usar el entorno Tomcat en lugar del entorno LDAP como se muestra arriba? ¿El enlace almacena una copia del objeto o una referencia al objeto? De lo que no estoy seguro es, por ejemplo, si 3 aplicaciones web acceden al objeto, ¿todas accederán a la misma instancia del objeto o diferentes instancias? Me gustaría que solo haya una instancia del objeto que puse en el árbol JNDI.Edita

Debo estar perdiendo algo muy simple. Aquí hay otro ejemplo que encontré que muestra cómo configurar un objeto JNDI en Tomcat -http: //flylib.com/books/en/4.255.1.275/1

Cómo es elcom.jspservletcookbook.StockPriceBean inicializado? Si una aplicación web utiliza el objeto com.jspservletcookbook.StockPriceBean y cambia su estado, ¿se refleja este cambio en todas las otras aplicaciones web que acceden a este objeto? Y lo más importante, cuántas instancias decom.jspservletcookbook.StockPriceBeane creará @: necesito que sea la misma instancia para todas las aplicaciones web que accederían al objeto.Edita

@ Ben Brunk: en este momento, los datos de la sesión se almacenan en un Mapa que es administrado por una de las aplicaciones (contexto). Todo lo que necesito es que las otras aplicaciones llamen a esta aplicación para verificar si la sesión es válida. Mi problema es que para que estas aplicaciones obtengan los servicios de la aplicación que administra los datos de la sesión, necesito usar JNDI para obtener una referencia al objeto relevante.

Los datos no se almacenarán en JNDI. Solo quiero usar JNDI como un medio para que las aplicaciones encuentren y usen el objeto Administrador de sesión. Sin embargo, el problema es que todo lo que leo sobre JNDI me lleva a creer que se usa para crear nuevos objetos cada vez que se busca o 'busca' un objeto en el directorio.

Aquí hay un diagrama que creo que muestra exactamente lo que quiero lograr:

Edita

@ EJP: solo para aclarar, las funciones que enumeré anteriormente son solo ejemplos de lo que podría hacer el objeto compartido. Estos se proporcionaron solo como un ejemplo. Todas las funciones que realizaría están relacionadas con el usuario y la sesión iniciada. Por ejemplo, información de la cuenta (nombre de usuario, último inicio de sesión, etc.), información de la contraseña (fecha de caducidad, etc.), privilegios del usuario (es decir, a qué áreas de la aplicación se le permite acceder).

Dado que la pregunta está realmente relacionada con la comunicación multitextual a través de JNDI (o cualquier otro medio) y no sobre los requisitos del objeto, no tiene sentido enumerar todo lo que se supone que debe hacer el objeto, así que acabo de enumerar ejemplos de lo que podría hacer.

Disculpas si la forma en que planteé la pregunta confundió a alguien.

Respuestas a la pregunta(4)

Su respuesta a la pregunta