Прокси-сервер Zuul на базе Tomcat не пересылает правильный IP-адрес клиента (request.getRemoteAddr ()) для завершения микросервиса

У меня есть настройка среды микросервисов на основе Spring Boot с этой конфигурацией -

  1. nginx в качестве балансировщика нагрузки на centos 7. (настроен на использование x-forwarded-for)
  2. Шлюз API с Spring boot на базе прокси-сервера netflix zuul. Tomcat - это встроенный контейнер.
  3. Микросервис продуктов на основе Spring Cloud. Tomcat как встроенный контейнер.

Версия Spring Boot: 1.5.6

Когда конечный пользователь обращается к микросервису продуктов, он проходит через Nginx -> шлюз Api -> Сервис продуктов.

Теперь проблема возникает, когда я хочу получить IP-адрес удаленного клиента в продуктах Microservice. Я всегда получаю 127.0.0.1 в качестве IP-адреса. Вот код в микросервисе продуктов, который извлекает IP-адрес клиента.

private String getClientIP() {       
    String xfHeader = request.getRemoteAddr();
    if (StringUtils.isBlank(xfHeader) || xfHeader.equals("127.0.0.1")) {
        return request.getHeader("X-Forwarded-For");
    }
    return xfHeader.split(",")[0];
}

API-шлюз application.properties настроен на использование server.use-forward-headers: true

P.S. Когда я пытаюсь переключиться с tomcat на undertow в моем API-шлюзе, я начинаю получать реальный IP-адрес клиента в микросервисе продуктов. Итак, проблема кроется где-то в моей конфигурации Tomcat в API-шлюзе.


person Munish Chandel    schedule 21.08.2017    source источник


Ответы (1)


вы можете создать фильтр zuul и изменить местоположение следующим образом

zuul:
  ignoreSecurityHeaders: false
  routes:
    app:
      path: /app/**
      sensitiveHeaders: 
      url: http://localhost:8082/app/
server:
    compression:
        enabled: true
    port: 80

и фильтровать

package smartHomeWebsite;

import java.util.Optional;

import org.springframework.cloud.netflix.zuul.filters.Route;
import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UrlPathHelper;

import com.netflix.util.Pair;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

@Component
public class LocationHeaderRewritingFilter extends ZuulFilter {

    private final UrlPathHelper urlPathHelper = new UrlPathHelper();
    private final RouteLocator routeLocator;

    public LocationHeaderRewritingFilter(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }

    @Override
    public String filterType() {
        return "post";
    }

    @Override
    public int filterOrder() {
        return 100;
    }

    public boolean shouldFilter() {
        return extractLocationHeader(RequestContext.getCurrentContext()).isPresent();
    }

    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        Route route = routeLocator.getMatchingRoute(urlPathHelper.getPathWithinApplication(ctx.getRequest()));
        if (route != null) {
            Pair<String, String> lh = extractLocationHeader(ctx).get();
            lh.setSecond(lh.second().replace(route.getLocation(),
                    ServletUriComponentsBuilder.fromCurrentContextPath().path(route.getPrefix()).build().toUriString()));
        }
        return null;
    }


    private Optional<Pair<String, String>> extractLocationHeader(RequestContext ctx) {

        return ctx.getZuulResponseHeaders()
                .stream()
                .filter(p -> "Location".equals(p.first()))
                .findFirst();
    }
}
person ali akbar azizkhani    schedule 21.08.2017