Приложение spring-boot в качестве spring-cloud-gateway должно использовать прокси: аргументы JVM не используются NOR spring.cloud.gateway.httpclient.proxy. ****

Должна ли Spring-boot иметь возможность использовать прокси с помощью глобальных аргументов JVM?

В целях тестирования я хочу изменить ответ между двумя приложениями с помощью ZAP Proxy.

В веб-приложении я настроил Java-процесс с глобальными аргументами JVM для использования прокси:

java -Dhttps.proxyHost=10.1.93.90 \
     -Dhttps.proxyPort=3128 \
     -Dhttp.proxyHost=10.1.93.90 \
     -Dhttp.proxyPort=3128 \
     -jar myapplication.jar

Но прокси не используется. Только один запрос проходит через прокси-сервер при запуске приложения к провайдеру openID для получения /auth/realms/master/.well-known/openid-configuration

Я знаю, как настроить прокси-сервер для JVM, и он работает для приложений без весенней загрузки.

Я читаю разные статьи, например так # 33951240 или spring-boot issue # 3968 и т.д ... НО в этом случае я не могу добавить дополнительный код, так как я должны использовать его как есть, поэтому spring devtools не является вариантом или советом по добавлению кода. Я мог бы попросить свою команду разработчиков добавить что-нибудь, но только в качестве последнего варианта.

Фрагмент кода, в котором запрос направляется в серверное приложение:

import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
[.....]

    protected Mono<ServerWebExchange> prepareExchange(ServerWebExchange exchange, ServerHttpRequest request) {
        return Mono.just(exchange.mutate().request(request).build());
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

        return ServerWebExchangeUtils.cacheRequestBody(exchange, request -> {

            return prepareExchange(exchange, request) //
                    .flatMap(mappedExchange -> chain.filter(mappedExchange).thenReturn(mappedExchange)) //
                    .flatMap(mappedExchange -> setRedirect(mappedExchange).thenReturn(mappedExchange)) //
                    .then()
                    .onErrorResume(OAuth2AuthorizationException.class, e -> setRedirectAfterError(exchange));//
        });
    }
[......]
  1. РЕДАКТИРОВАТЬ после отзывов моей команды разработчиков. Важная информация заключается в том, что это приложение действует как шлюз между интерфейсом (браузером) и сервером. Application.yml содержит настройки шлюза для маршрутизации трафика в соответствии с spring-cloud- шлюз

Согласно проблеме Spring-Cloud-Gateway № 176, это возможно с 2.0.0.M8.

Мы используем spring-boot 2.2.4 с spring-cloud-gateway 2.2.1 и Reaction-netty 0.9.4

Значит, я смогу использовать эту настройку?

spring.cloud.gateway.httpclient.proxy.host=10.1.93.90
spring.cloud.gateway.httpclient.proxy.port=3128

Но с такими настройками конфигурация маршрута в шлюзе полностью игнорируется, и интерфейс (браузер) пытается напрямую подключиться к бэкэнду. Странный!


person psytester    schedule 23.11.2020    source источник


Ответы (1)


АРГХХ! Наконец, это был дополнительный выпуск прокси ZAP.

После включения вывода отладки я увидел несколько странных заголовков HTTP и 302 Redirect, почему браузер пытается напрямую подключиться к бэкэнду.

Received response (auto-read:false) : [.....
    Content-Security-Policy=.....connect-src https://zap wss://zap;.....
    Access-Control-Allow-Headers=ZAP-Header,
    X-Clacks-Overhead=GNU Terry Pratchett,
    Location=https://<backend-ip>/.....] - r.n.h.c.HttpClientOperations:254

С такой информацией из заголовка я поискал и нашел окончательную первопричину моей проблемы в проблемах zaproxy # 5790 .

Подводя итог резолюции.

  1. Spring-Cloud-Gateway требует особой конфигурации
spring.cloud.gateway.httpclient.proxy.host=<ip of proxy>
spring.cloud.gateway.httpclient.proxy.port=<port of proxy>
  1. если используется ZAP Proxy: после отключения функции HUD в ZAP proxy он работает должным образом.
person psytester    schedule 25.11.2020