Обмен данными сеанса между контекстами в Tomcat - PullRequest
24 голосов
/ 24 февраля 2012

Я искал решения для обмена данными сеанса между военными файлами Mutliple. Я наткнулся на следующее решение http://www.fwd.at/tomcat/sharing-session-data-howto.html

Основная идея заключается в том, что если у вас более одного файла war, вы можете установить cookie, используя sessionid первого используемого контекста.

Файл cookie может быть установлен с использованием пути, который будет применяться ко всем контекстам / приложениям.

Например, если у меня есть следующая конфигурация для 3 приложений

/myapp/app1
/myapp/app2
/myapp/app3

Я могу установить cookie следующим образом

/ myapp sessionid.

Сеансовый cookie будет затем отправлен на любой запрос с / myapp в адресе. Это позволяет идентификатору сеанса затем использоваться любым из контекстов.

Единственная проблема этого подхода заключается в том, что он был написан в 2003 году и протестирован на Tomcat 4.

Что вы думаете об этом подходе? Есть ли лучший способ сделать это?

Спасибо

Ответы [ 4 ]

42 голосов
/ 25 февраля 2012

Эта статья действительно сильно устарела.

В Tomcat 5.5 и 6.0 вы можете просто установить атрибут emptySessionPath в true в элементе <Connector> в /conf/server.xml.

<Connector ... emptySessionPath="true">

В Tomcat 7.0 это изменилось, поскольку теперь его можно настраивать с помощью Servlet 3.0 API.Затем он настраивается на стороне Tomcat, устанавливая sessionCookiePath в / в элементе <Context> в любом ответственном файле context.xml.

<Context ... sessionCookiePath="/">

Как уже говорилось, есть новый API Servlet 3.0, который позволяет вамнастроить cookie сессии через стандартный API.Вы можете сделать это либо декларативно, добавив следующее к web.xml:

<session-config>
    <cookie-config>
        <path>/</path>
    </cookie-config>
</session-config>

или программно к SessionCookieConfig, который доступен по ServletContext#getSessionCookieConfig().

getServletContext().getSessionCookieConfig().setPath("/");

Вы можете сделать это в ServletContextListener#contextInitialized() или HttpServlet#init().

См. Также:

2 голосов
/ 24 февраля 2012

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

Вы можете поместить данные в файл cookie (я не рекомендую).

Или укажите защищенный идентификатор сеанса, который можно использовать для доступа к какой-либо форме хранилища (БД или распределенный кеш и т. Д.) Для получения необходимых данных.

1 голос
/ 25 февраля 2012

Если объем данных не является астрономическим, а сами данные не меняются слишком быстро, вы можете рассмотреть возможность использования JNDI. Это решение было разработано именно для того, что вы ищете.

Вы можете посмотреть официальную документацию или в этой публикации в списке рассылки tomcat-user , где приведены ссылки и примеры.

0 голосов
/ 23 апреля 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>

Я развертываю тот же простойwebapp дважды 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");  

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

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

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