Проблема с URL-адресом перенаправления Spring при использовании прокси-сервера Zuul

Последние 2 дня я безуспешно пытался разобраться в странной проблеме перенаправления.

На основе примеров проектов Spring-Cloud я настроил Eureka, Zuul и базовый сервис, который работает за Zuul.

У меня есть следующий метод;

@RequestMapping(method = RequestMethod.POST, value = "/register")
public String registerDevice(Principal principal, String response) {
  // ...
  return "redirect:/account";
}

Форма настроена для публикации на прокси-URL следующим образом:

POST https://localhost:8443/service/register

(Zuul работает на localhost: 8443).

URL-адрес для локальной службы (без прокси) будет: http://localhost:9001/register

Вызов POST правильно проксируется через указанный выше метод, однако адрес перенаправления, отправляемый в браузер, является URL-адресом службы без прокси; http://localhost:9001/account

Прокси-сервер Zuul определенно отправляет правильные заголовки x-forwarded- *, поэтому я ожидаю, что преобразователь представлений в Spring построит правильное перенаправление на основе значений x-forwarded.

Чтобы убедиться, что заголовки отправлены правильно, я изменил конфигурацию метода следующим образом;

@RequestMapping(method = RequestMethod.POST, value = "/register")
public void registerDevice(Principal, String response, HttpServletResponse response) {
  // ...
  String rUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/account").build().toUriString();
  servletResponse.sendRedirect(rUrl);
}

Что правильно перенаправляет браузер в прокси-сервер; https://localhost:8443/service/account

Это ошибка или это ожидаемое поведение? Я думал, что использование "redirect:" предназначено для соблюдения заголовков переадресации, передаваемых прокси.


person JamieB    schedule 17.02.2016    source источник
comment
Вы нашли для этого решение?   -  person Damien Polegato    schedule 24.05.2016


Ответы (2)


Как видите, _ 1_ игнорирует X-FORWARDED-* заголовки. Проще говоря, вы не можете использовать "redirect:/account".

Вместо этого создайте экземпляр RedirectView и настройте его соответствующим образом:

RedirectView redirect = new RedirectView("account");
redirect.setHosts(new String[]{ request.getHeader("X-FORWARDED-HOST") });

Начиная с Spring Framework 4.3 (в настоящее время RC1) _ 6_.

person ksokol    schedule 17.02.2016
comment
У меня такая же проблема, и я не вижу setHosts () в последней версии RedirectView (v4.2.5) - person Damien Polegato; 27.04.2016
comment
@ damien-polegato, ты прав! setHosts был добавлен в Spring Framework 4.3. Я обновил свой ответ. Спасибо. - person ksokol; 27.04.2016
comment
спасибо, мой вопрос с той же проблемой здесь, если у вас есть какие-либо подсказки: stackoverflow.com/questions/36881835/ - person Damien Polegato; 27.04.2016

Если вы используете tomcat в качестве встроенного сервера в своем бэкэнд-приложении, вы можете использовать следующие настройки (application.properties, yml и т. Д.):

server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto

Или более общий способ:

server.use-forward-headers=true
person mawoc    schedule 18.04.2017