Любой способ поделиться состоянием сеанса между различными приложениями в Tomcat? - PullRequest
51 голосов
/ 20 марта 2009

Мы хотим разделить работающее приложение на два разных файла .war, чтобы иметь возможность обновлять одно приложение, не затрагивая другое. У каждого веб-приложения будет свой пользовательский интерфейс, разные пользователи и разное расписание развертывания.

Кажется, что самым простым путем является совместное использование одного и того же сеанса, поэтому, если приложение A установлено session.setAttribute("foo", "bar"), приложение B сможет его увидеть.

Есть ли способ поделиться состоянием HttpSession для обоих приложений в одном экземпляре Tomcat?

Наше приложение работает на выделенном Tomcat 5.5, на том же экземпляре tomcat нет других приложений, поэтому любые проблемы безопасности, связанные с совместным использованием сеанса, не являются проблемой. Мы запускаем несколько экземпляров Tomcat, но балансировщик использует липкие сессии.

Если это невозможно или это совместное использование сеанса действительно плохая идея, пожалуйста, оставьте комментарий.

Ответы [ 10 ]

26 голосов
/ 20 марта 2009

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

23 голосов
/ 22 марта 2009

Следует помнить, что два веб-приложения будут использовать разные загрузчики классов. Если вы хотите поделиться объектами, им нужно использовать ту же версию класса из того же загрузчика классов (иначе вы получите LinkageErrors). Это означает либо размещение их в загрузчике классов, совместно используемом обоими веб-приложениями (например, системный путь к классу), либо использование сериализации для эффективной загрузки и восстановления объекта в правильном загрузчике классов с правильной версией класса.

7 голосов
/ 15 января 2015

Если вы хотите использовать Spring, есть проект под названием Spring Session : https://github.com/spring-projects/spring-session

Цитата: "HttpSession - позволяет заменить HttpSession в контейнере приложения (т.е. Tomcat) нейтральным способом"

5 голосов
/ 20 марта 2009

Если веб-приложения настолько тесно связаны, что им нужно совместно использовать объекты, почему вы разделяете его на две части? Даже если вы управляете ими в некоторой степени независимо, любая приличная система управления сборкой должна иметь возможность создать один файл WAR для развертывания.

Решение, подобное предложенному Аароном с JNDI, будет работать, но только если оба веб-приложения работают на одном сервере. Если устройства тесно связаны, и вы все равно собираетесь его запускать на одном и том же сервере ... может также иметь одну WAR

Если вы действительно хотите, чтобы они стояли независимо, я бы серьезно изучил обмен данными между ними. В идеале вы хотите, чтобы они обменивались только соответствующими данными друг с другом. Эти данные могут передаваться взад и вперед через параметры POST (или GET, если это более уместно), вы можете даже подумать об использовании файлов cookie.

3 голосов
/ 17 октября 2011

Один из способов сделать это описан в этом сообщении в блоге: Совместное использование сеанса в Apache Tomcat

Сводка: добавьте emptySessionPath в конфигурацию соединителя и перекрестный текст в контекст

1 голос
/ 25 апреля 2019

Для Tomcat 8 я использую следующую конфигурацию для совместного использования сеанса между 2 веб-приложениями:

conf / context.xml

<Context sessionCookiePath="/">
    <Valve className="org.apache.catalina.valves.PersistentValve"/>
    <Manager className="org.apache.catalina.session.PersistentManager">
        <Store className="org.apache.catalina.session.FileStore" directory="${catalina.base}/temp/sessions"/>
    </Manager>
    ...
</Context>

Я развертываю одно и то же простое веб-приложение дважды log.war и log2.war :

/log
/log2

Теперь я могу войти в систему /log и отобразить пользователя в /log2, это не работает с конфигурацией tomcat по умолчанию.

enter image description here

Значение сеанса устанавливается и читается:

HttpSession session=request.getSession();  
session.setAttribute("name",name);

HttpSession session=request.getSession(false);  
String name=(String)session.getAttribute("name");  

Я использовал этот проект в качестве примера: https://www.javatpoint.com/servlet-http-session-login-and-logout-example

В большинстве примеров / решений используется база данных в памяти, требующая дополнительной настройки:

0 голосов
/ 04 июня 2018

Я разработал сервер состояния сеанса для Tomcat, использующего Python.

В связи с этим мне не нужно изменять код, уже написанный для создания / доступа и уничтожения сеанса. Также существует отдельный сервер / служба, которая обрабатывает и хранит сеанс, поэтому не требуется мастер-кластер. В этом случае репликация сессий (как в кластеризации tomcat) отсутствует, скорее это совместное использование сессий между веб-фермерами.

0 голосов
/ 27 июня 2017

Tomcat 8: я должен был сделать: <Context crossContext="true" sessionCookiePath="/"> в conf / context.xml

подробнее об атрибутах конфигурации здесь

и затем установить значение (как ответ @ Qazi):

ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
servletContext.setAttribute(variableName,variableValue)

чтобы получить значение:

ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
servletContext.getAttribute("user"); 
0 голосов
/ 30 апреля 2013

Вы можете сделать это, взяв контекст сервлета за корень контекста.

Для извлечения переменной.

request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute(variableName)

Для настройки переменной:

request.getSession().getServletContext().getContext("/{applicationContextRoot}").setAttribute(variableName,variableValue)

Примечание: Оба приложения должны быть развернуты на одном сервере.

Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы

0 голосов
/ 22 марта 2009

Вы не должны разделять ваше приложение таким образом, чтобы иметь высокую доступность. Вы можете развернуть все приложение на многих экземплярах Tomcat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...