Как обрабатывать сеансы на нескольких причалах на одном хосте и порту - динамические контексты

У меня есть следующие требования

  1. Несколько JAR-файлов. На каждом работает встроенный Jetty.
  2. Запускайте всех на одном домене/порте — используя обратный прокси (Apache)
  3. JAR может иметь несколько экземпляров, работающих на разных машинах (но на одном хосте/порте).
  4. Полное разделение сеансов — абсолютно никакого обмена даже между двумя экземплярами одного и того же веб-приложения.
  5. Масштабируйте все это динамически.
  6. Я не знаю, актуально ли это, но я знаю, что Spring Security используется в некоторых из этих веб-приложений.

Я все заработал, добавив правила обратного прокси и перезапустив Apache. Вот упрощенное описание двух экземпляров для webapp-1 и двух экземпляров для webapp-2.

http://mydomain.com/app1 ==> 1.1.1.1:9099
http://mydomain.com/app2 ==> 1.1.1.1:9100
http://mydomain.com/app3 ==> 1.1.1.2:9099
http://mydomain.com/app4 ==> 1.1.1.2:9100

После успешной (почти) настройки мы видим проблемы с файлом cookie JSESSIONID. Каждое приложение переопределяет файлы cookie других, а это означает, что нам еще предстоит добиться полного разделения сеансов, поскольку одно влияет на другое.

Я много читал об этой проблеме в Интернете, но решений никогда не бывает достаточно в моем сценарии.

ИДЕАЛЬНЫМ решением для меня было бы определить JETTY для использования какого-то UUID для имени файла cookie. Я до сих пор не могу понять, почему это не по умолчанию.

Я бы даже пошел на решение JavaScript. Преимущество JavaScript в том, что он может видеть URL-адрес после обработки ReverseProxy. Итак, для http://mydomain.com/XXX я могу определить имя файла cookie как XXX_JSESSIONID.

Но я не могу найти руководство по ним.

Итак, как я могу решить эту проблему и получить полное разделение сеансов?


person guy mograbi    schedule 26.04.2013    source источник
comment
Что вы используете для управления сессиями? Сеансы JDBC Jetty, менеджеры хеш-сессий по умолчанию, монго ... пользовательский?   -  person jesse mcconnell    schedule 26.04.2013
comment
по умолчанию, насколько я знаю. Я вижу файлы cookie JSESSIONID в браузере. У меня вообще БД нет. Я не писал собственный менеджер сеансов.   -  person guy mograbi    schedule 26.04.2013


Ответы (1)


Вы должны потратить некоторое время на то, чтобы понять, какой менеджер сеансов вы используете и какие функции/преимущества он вам дает. Если у вас нет доступной базы данных и у вас нет собственного диспетчера сеансов, то я склонен полагать, что вы используете распространяемый нами HashSessionManager, который можно использовать для управления сеансом только на одном хосте, в этом случае нет совместного использования сеанса между jvms. .

Если вы используете 4 отдельных процесса jvm (и используете HashSessionManager), как видно из приведенного выше, сеансы не распределяются между узлами.

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

http://www.eclipse.org/jetty/documentation/current/session-management.html

Вы можете установить новое имя org.eclipse.jetty.servlet.SessionCookie для каждого контекста веб-приложения, и это должно решить вашу непосредственную проблему.

person jesse mcconnell    schedule 26.04.2013
comment
Привет. Вероятно, я использую HashSessionManager. Но, как указано в моем вопросе, изменение контекста не подходит. Мне нужно что-то более динамичное. Есть ли аргумент JVM, который я могу передать, который будет делать то же самое? Сеансы не используются совместно — хуже того, они переопределяются. Когда я получаю доступ к приложению2, я выхожу из приложения1. Я предполагаю, что правильные производственные проекты определяют другое имя файла cookie. Как это влияет на весеннюю безопасность? существуют ли модули, которые жестко кодируют имя JSESSIONID? - person guy mograbi; 27.04.2013