Usando JNDI para compartilhar objetos e dados da sessão de servlet no Tomcat

Nas últimas semanas, estive procurando soluções para compartilhar um objeto entre dois contextos / arquivos de guerra. Há várias maneiras de fazer isso e uma delas é JNDI.

Não estou muito familiarizado com o JNDI usado no Tomcat, por isso gostaria de esclarecer algumas perguntas:

Basicamente, eu tenho uma instância de um objeto que forneceria os seguintes serviços para mais de um contexto / aplicativo

Verifique se o usuário está conectado Verifique se a sessão do usuário é válidaLogon user - Inclui o registro dos detalhes de logonsuário @Logout - Remover sessão

ada aplicativo chamará esse objeto para validar o usuário antes de processar qualquer solicitação. O que eu não entendo é como o objeto funcionaria se fosse armazenado no JNDI. Vi alguns exemplos de como o JNDI é usado no Tomcat, mas 99% dos exemplos mostram como configurar uma fonte de dados JDB

Como exatamente o objeto foi inicializado no JNDI. Por exemplo, a seguinte configuração dos documentos do Tomcat mostrou a configuração para 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">

Como eu faria uma coisa semelhante no meu caso e, o mais importante, como inicializaria o objeto antes de ser colocado na árvore JNDI. Quando está na árvore JNDI, como é atualizado?

Acho que o que estou procurando é um exemplo simples do uso de JNDI no Tomcat, mas não para conexões de banco de dados, mas para objetos do tipo provedor de serviço

Estive lendo este tutorialhttp: //docs.oracle.com/javase/tutorial/jndi/ops/bind.htmas está mais focado nos diretórios de nomeação LDAP, o que realmente não ajud

Edita

Ok, encontrei um exemplo no tutorial listado acima, que mostra como "vincular" um objeto à árvore JND

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);
    }
    }
}
Como eu o modificaria para usar o ambiente Tomcat em vez do ambiente LDAP, como mostrado acim A ligação armazena uma cópia do objeto ou uma referência ao objeto? O que eu não tenho certeza é, por exemplo, se 3 webapps acessarem o objeto, todos estarão acessando a mesma instância do objeto ou instâncias diferentes? Gostaria que houvesse apenas uma instância do objeto que eu coloquei na árvore JNDI.Edita

Deve estar faltando algo muito simples. Aqui está outro exemplo que encontrei, que mostra como configurar um objeto JNDI no Tomcat -http: //flylib.com/books/en/4.255.1.275/1

Como está ocom.jspservletcookbook.StockPriceBean inicializado? Se um aplicativo da web usar o objeto com.jspservletcookbook.StockPriceBean e alterar seu estado, essa alteração será refletida em todos os outros aplicativos da web que acessam esse objeto? E o mais importante, quantas instâncias docom.jspservletcookbook.StockPriceBean será criado - preciso que seja a mesma instância para todos os aplicativos da web que acessariam o objetEdita

en Brunk - No momento, os dados da sessão são armazenados em um mapa gerenciado por um dos aplicativos (contexto). Tudo o que eu preciso é que os outros aplicativos chamem esse aplicativo para verificar se a sessão é válida. Meu problema é que, para esses aplicativos obterem os serviços do aplicativo que gerencia os dados da sessão, preciso usar o JNDI para obter uma referência ao objeto relevant

Os dados não serão armazenados no JNDI. Eu só quero usar o JNDI como um meio para os aplicativos encontrarem e usarem o objeto Session Manager. O problema, porém, é que tudo o que li sobre o JNDI me leva a crer que ele é usado para criar novos objetos toda vez que um objeto é pesquisado ou 'procurado' no diretóri

qui está o diagrama que eu acho que mostra exatamente o que eu quero alcança

Edita

@ EJP - Apenas para esclarecer, as funções listadas acima são apenas exemplos do que o objeto compartilhado pode fazer. Estes foram fornecidos apenas como um exemplo. Todas as funções que ele faria estão relacionadas ao usuário e à sessão conectada. Por exemplo, coisas como informações da conta (nome de usuário, último login etc.), informações de senha (data de validade etc.), privilégios do usuário (ou seja, em quais áreas do aplicativo o usuário tem permissão para acessar).

Dado que a pergunta está realmente relacionada à comunicação multi-contexto via JNDI (ou qualquer outro meio) e não aos requisitos do objeto, não faz sentido listar tudo o que o objeto deve fazer, então apenas listei exemplos do que poderia fazer.

esculpas se a maneira como eu coloquei a pergunta confundiu algué

questionAnswers(4)

yourAnswerToTheQuestion