Использование JNDI для совместного использования объектов сеанса сервлета и данных в Tomcat

В течение последних нескольких недель я искал решения для разделения объекта между двумя файлами context / war. Это можно сделать несколькими способами, и одним из них является JNDI.

Я не очень знаком с JNDI, используемым в Tomcat, поэтому хотел бы прояснить несколько вопросов:

В основном у меня есть экземпляр объекта, который будет предоставлять следующие услуги более чем одному контексту / приложению

Убедитесь, что пользователь вошел в системуПроверьте, что сеанс пользователя действителенПользователь входа в систему - включает регистрацию данных входа в системуВыйти из системы - удалить сеанс

Каждое приложение будет вызывать этот объект для проверки пользователя перед обработкой любых запросов. Что я не понимаю, так это как объект будет работать, если он хранится в JNDI. Я видел несколько примеров того, как JNDI используется в Tomcat, но 99% примеров показывают, как настроить источник данных JDBC.

Как именно объект инициализируется в JNDI. Например, в следующей конфигурации из документов Tomcat показана конфигурация для 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">

Как бы я сделал аналогичную вещь в моем случае и, самое главное, как бы я инициализировал объект, прежде чем он будет помещен в дерево JNDI. Как только он обновляется в дереве JNDI?

Я думаю, что я ищу, это простой пример использования JNDI в Tomcat, но не для соединений с базой данных, а для объектов типа поставщика услуг.

Я читал этот урокhttp://docs.oracle.com/javase/tutorial/jndi/ops/bind.html но он больше ориентирован на каталоги имен LDAP, которые не очень помогают.

редактировать

Хорошо, я нашел пример в учебнике, который я перечислил выше, который показывает, как «связать» объект с деревом 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);
    }
    }
}
Как бы я изменил его, чтобы использовать среду Tomcat вместо среды LDAP, как показано выше?Хранит ли привязка копию объекта или ссылку на объект? В чем я не уверен, например, если 3 веб-приложения имеют доступ к объекту, все ли они будут иметь доступ к одному и тому же экземпляру объекта или к различным экземплярам? Я хотел бы, чтобы был только один экземпляр объекта, который я поместил в дерево JNDI.редактировать

Я должен упустить что-то очень простое. Вот еще один пример, который я нашел, который показывает, как настроить объект JNDI в Tomcat:http://flylib.com/books/en/4.255.1.275/1/

Какcom.jspservletcookbook.StockPriceBean инициализируется?Если одно веб-приложение использует объект com.jspservletcookbook.StockPriceBean и изменяет его состояние, отражается ли это изменение во всех других веб-приложениях, которые обращаются к этому объекту?И самое главное, сколько экземпляровcom.jspservletcookbook.StockPriceBean будет создан - мне нужно, чтобы он был одинаковым экземпляром для всех веб-приложений, которые будут обращаться к объекту.редактировать

@Ben Brunk - В настоящий момент данные сеанса хранятся в карте, которая управляется одним из приложений (контекст). Все, что мне нужно, это чтобы другие приложения вызывали это приложение, чтобы проверить, действителен ли сеанс. Моя проблема заключается в том, что для этих приложений, чтобы получить службы приложения, которое управляет данными сеанса, мне нужно использовать для них JNDI, чтобы получить ссылку на соответствующий объект.

Данные не будут сохранены в JNDI. Я просто хочу использовать JNDI как средство для приложений, чтобы найти и использовать объект Session Manager. Проблема в том, что все, что я читаю о JNDI, заставляет меня поверить, что оно используется для создания новых объектов каждый раз, когда объект ищется или «ищется» в каталоге.

Вот диаграмма, которая, я думаю, показывает именно то, чего я хочу достичь:

редактировать

@EJP - Просто чтобы уточнить, функции, которые я перечислил выше, являются лишь примерами того, что может делать общий объект. Они были предоставлены только в качестве примера. Все функции, которые он будет выполнять, связаны с пользователем и сессией, вошедшей в систему. Например, такие как информация об учетной записи (имя пользователя, последний логин и т. Д.), Информация о пароле (дата истечения срока действия и т. Д.), Привилегии пользователя (т.е. к каким областям приложения пользователь имеет доступ).

Учитывая, что вопрос действительно связан с многоконтекстным взаимодействием через JNDI (или любым другим способом), а не с требованиями объекта, на самом деле не имеет смысла перечислять все, что объект должен делать, поэтому я просто перечислил примеры о том, что он мог сделать.

Извинения, если способ, которым я поставил вопрос, смутил любого.

Ответы на вопрос(2)

Ваш ответ на вопрос