В течение последних нескольких недель я искал решения для разделения объекта между двумя файлами контекстов / военных действий. Это можно сделать несколькими способами, и одним из них является 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 (или любым другим способом), а не с требованиями объекта, на самом деле не имеет смысла перечислять все, что объект должен делать, поэтому просто перечислил примеры того, что он мог сделать.
Извинения, если вопрос, который я задаю, смущает кого-либо.