Подтвердить что ты не робот

Обмен данными сеанса между контекстами в Tomcat

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

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

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

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

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

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

/myapp sessionid.

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

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

Как вы оцениваете этот подход? Есть ли лучший способ сделать это?

Спасибо

4b9b3361

Ответ 1

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

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

<Connector ... emptySessionPath="true">

В Tomcat 7.0 это изменилось, поскольку теперь оно настраивается с помощью API Servlet 3.0. Затем на стороне 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

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

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

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

Ответ 3

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

Вы можете посмотреть официальную документацию или эту запись в tomcat -user mailing для ссылок и примеров.