Сервлет, действующий в качестве прокси: как переслать сессию? - PullRequest
0 голосов
/ 10 марта 2012

Я не слишком уверен в возможности выполнения требования, которое я пытаюсь выполнить, но вот как это происходит:

  • Я создал сервлет, который действует как прокси.Он получает вызов RESTful, а затем вызывает другую службу RESTful на удаленном сервере (узле).
  • Переадресация осуществляется через HTTPClient, а не с помощью диспетчера запросов.Я в основном отправляю новый HTTP-запрос на удаленный сервер.
  • Когда первый сервер (прокси-сервер) получает вызов, запрос (HttpServletRequest) имеет сессию, связанную с ним.Свойство isNew() HTTPSession имеет значение false.
  • Когда вызов перенаправляется и удаленный сервер принимает вызов, сеанс становится совершенно новым.

Я пытаюсь найти способ перенаправить сеанс на удаленный сервер.

Точнее: Можно ли просто получить сеанс из HttpServletRequest и поместить егов сеанс недавно созданного HTTP-запроса (через HTTPClient)?

Ответы [ 3 ]

2 голосов
/ 10 марта 2012

Это зависит от того, как ваш удаленный WS поддерживает сеанс. Если, например, он использует куки (Tomcat делает это среди других методов), то перенаправление входящих заголовков должно помочь вам в этом (убедитесь, что вы упомянули, что вы принимаете куки, но я думаю, HTTPClient делает это по умолчанию). Теперь, если он основан на параметре в URL-адресе, попытайтесь воспроизвести это поведение.

1 голос
/ 03 мая 2012

Если два узла (прокси и сервис) являются отдельными процессами, которые не являются частью кластера приложений, то, вероятно, нет.

Контейнер сервлета обычно управляет HttpSession.Если вы перенаправляете запрос в другую службу, размещенную в другом контейнере, у вас будет другой объект сеанса.

Если два узла являются частью кластера, то обычно сеанс может быть разделен между узлами.в кластере с помощью ряда механизмов (в репликации памяти, синхронизации базы данных и т. д.).

Еще один вариант - преобразовать данные сеанса во что-то вроде Redis, Memcached, Coherence и т. д. Некоторые серверы приложений имеют подключаемыеподдержка такого процесса.Я полагаю, что в этом сценарии узлы сервера приложений не обязательно должны быть частью кластера для совместного использования данных сеанса.

0 голосов
/ 08 мая 2012

Мне не хватало некоторых основ обработки сеансов, когда я задавал этот вопрос.После некоторого исследования и обсуждения вот что я получил:

  • По сути, сессии обрабатываются переменной JSESSIONID.
  • JSESSIONID создается автоматически (может быть отключено), когда запрос попадает на сервер.
  • Он отправляется обратно в заголовке ответа.
  • Причина, по которой удаленный сервер считает, что это новый сеанс, заключается в том, что в запросе не установлен этот JSESSIONID.

  • Прокси-сервер выполняет следующие действия, чтобы обеспечить переадресацию сеанса.:

    1. Когда поступает входящий запрос;создайте и сохраните JSESSIONID.
    2. Отправьте новый запрос на удаленный сервер.
    3. Распакуйте заголовок ответа с удаленного сервера и извлеките JSESSIONID.
    4. Поддерживать сопоставление клиентской стороны JSESSIONID и удаленного сервера JSESSIONID.
    5. Для любого из следующих запросов используйте это сопоставление для отправки запросов на удаленный сервер.

По сути, прокси выполняет сопоставление с JSESSIONID на стороне клиента и JSESSIONID на удаленном сервере.Таким образом, сеанс перенаправляется на удаленный сервер.

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