как заставить имя хоста, когда за цепочкой из 2 рессе прокси - PullRequest
0 голосов
/ 02 июля 2019

Приложение с весенней загрузкой размещено за 2 обратными прокси-серверами (в цепочке).

обратный прокси 1 -> обратный прокси 2 -> приложение с весенней загрузкой

И заголовки хоста и форварда неправильно соединены. Есть ли способ заставить хост к фиксированному значению? как имя хоста "обратного прокси 1"?

1 Ответ

0 голосов
/ 03 июля 2019

Я исправил проблему, изменив имя_сервера во входящем запросе.

Я добавил клапан в tomcat:

public class HostForceValve extends ValveBase {

private final String proxyName;

public HostForceValve(String proxyName) {
    this.proxyName = proxyName;
}

@Override public void invoke(Request request, Response response) throws IOException, ServletException {
    org.apache.coyote.Request coyoteRequest = request.getCoyoteRequest();
    MimeHeaders mimeHeaders = coyoteRequest.getMimeHeaders();
    mimeHeaders.removeHeader("host");
    final MessageBytes host = mimeHeaders.addValue("host");
    host.setString(proxyName);
    request.setRemoteHost(proxyName);
    request.getCoyoteRequest().serverName().setString(proxyName);
    try {
        Valve next = getNext();
        if (null == next) {
            return;
        }
        next.invoke(request, response);
    } finally {
        request.setRemoteHost(proxyName);
    }

}
}

И добавил это значение на встроенный сервер Tomcat:

@Component
public class MyTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

@Value("${proxyName:}")
private String proxyName;

@Override
public void customize(TomcatServletWebServerFactory factory) {
    final Collection<Valve> currents = factory.getEngineValves();
    final ArrayList<Valve> addValves = new ArrayList<>(currents);
    if (StringUtils.hasLength(proxyName)) {
        addValves.add(0, new HostForceValve(proxyName));
    }
    factory.setEngineValves(addValves);
}
}
...