2012-03-09 2 views
0

Я не слишком уверен в осуществимости требования, что я пытаюсь достичь, но вот как это идет:Сервлет, действующий как прокси: как переслать сеанс?

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

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

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

ответ

2

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

1

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

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

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

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

0

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

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

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

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

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

Смежные вопросы