Обмен данными сеанса между контекстами в 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.
Как вы оцениваете этот подход? Есть ли лучший способ сделать это?
Спасибо
Ответы
Ответ 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 для ссылок и примеров.