Jetty-Jersey как обрабатывать запросы за обратным прокси?

#java #jersey #jetty #embedded-jetty

#java #джерси #jetty #встроенный-jetty

Вопрос:

Я использую:

  • Jetty 9.4.12.v20180830
  • Jersey 2.28

Есть ли рекомендуемый способ украсить наш веб-сервер для обработки запросов за обратным прокси?

Т.е. относительные пути и Location заголовки отображаются некорректно, потому что у прокси-сервера другой хост и маршруты разные.

Я мог бы ожидать найти фильтры для обработки (x-)forwarded* заголовков. Например, я нашел эту (qaware / x-forwarded-filter), но это не стандартная библиотека…

Ответ №1:

Настройте свой обратный прокси, чтобы обеспечить Forwarded (https://www.rfc-editor.org/rfc/rfc7239 ) заголовок запроса к причалу.

Затем добавьте ForwardedRequestCustomizer к вашему HttpConfiguration в вашем ServerConnector .

Так и должно быть.

Комментарии:

1. Понятно, спасибо. Этот настройщик также обрабатывает изменение заголовков ответов? Такие вещи, как заголовки местоположений, чтобы они работали перед прокси (при условии, что прокси заполняет правильные перенаправленные заголовки)?

2. ForwardedRequestCustomizer обновляет внутренние компоненты запроса, в частности, для полномочий запроса (делает его соответствующим предполагаемому назначению агента пользователя, а не фактическому назначению), на котором основаны все сгенерированные местоположения ответа. Таким образом, да, это вызывает изменение ответа.

3. О, и обновите свою версию Jetty (рассмотрим 9.4.35), поскольку с 9.4.12 в ForwardedRequestCustomizer были внесены сотни улучшений.

4. Спасибо, сегодня я потратил некоторое время на попытку 9.4.35 с добавлением ForwardedRequestCustomizer. Еще одним препятствием для меня является то, что наш прокси-сервер Envoy вырезает часть маршрута. Например, запрос клиента на «/ a / b / c» поступает на сервер после прокси как «/ b / c». Таким образом, местоположение возвращается как «хост: порт / b / c», который не работает перед прокси (он должен быть «хост: порт / a / b / c»). Есть ли способ справиться с этим?