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

Последние несколько недель я искал решения для совместного использования объекта между двумя контекстами / файлами войны. Есть несколько способов сделать это, и один из них - JNDI.

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

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

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

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

  • Как именно объект инициализируется в JNDI. Например, следующая конфигурация из документации Tomcat показывает конфигурацию для JDBC
 

Как бы я сделал то же самое в моем случае и, что наиболее важно, как бы инициализировать объект, прежде чем он будет помещен в дерево 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 env = new Hashtable(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 - мне нужно, чтобы он был одним и тем же экземпляром для всех веб-приложений, которые будут обращаться к объекту.

Edit

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

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

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

Obtaining a reference

Edit

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

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

Прошу прощения, если то, как я поставил вопрос, кого-то смутил.

5
задан ziggy 29 February 2012 в 09:45
поделиться