|
|
@@ -7,13 +7,11 @@ import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
|
|
|
import io.netty.handler.timeout.ReadTimeoutHandler;
|
|
|
import io.netty.handler.timeout.WriteTimeoutHandler;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.apache.http.ssl.SSLContextBuilder;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.http.MediaType;
|
|
|
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
|
|
|
-import org.springframework.util.ResourceUtils;
|
|
|
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
|
|
|
import org.springframework.web.reactive.function.client.ExchangeStrategies;
|
|
|
import org.springframework.web.reactive.function.client.WebClient;
|
|
|
@@ -21,16 +19,13 @@ import org.springframework.web.util.DefaultUriBuilderFactory;
|
|
|
import reactor.core.publisher.Mono;
|
|
|
import reactor.netty.http.client.HttpClient;
|
|
|
import reactor.netty.resources.ConnectionProvider;
|
|
|
-import reactor.netty.tcp.SslProvider;
|
|
|
|
|
|
-import javax.net.ssl.SSLContext;
|
|
|
import javax.net.ssl.TrustManager;
|
|
|
import javax.net.ssl.X509TrustManager;
|
|
|
-import java.security.SecureRandom;
|
|
|
import java.security.cert.X509Certificate;
|
|
|
import java.time.Duration;
|
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.Map;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
/**
|
|
|
* @description: WebClientCon 配置类
|
|
|
@@ -137,6 +132,51 @@ public class WebClientConfig {
|
|
|
})).build();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public WebClient createSecureWebClientAs(String domain) throws Exception {
|
|
|
+ // 配置HTTP连接池
|
|
|
+ ConnectionProvider connectionProvider = ConnectionProvider.builder("secure-" + domain)
|
|
|
+ .maxConnections(CONNECTION_PROVIDER_MAX_CONNECTIONS)
|
|
|
+ .maxIdleTime(CONNECTION_PROVIDER_MAX_IDLE_TIME)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ SslContext sslContext = SslContextBuilder.forClient()
|
|
|
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ // 配置带SSL的HTTP客户端
|
|
|
+ HttpClient httpClient = HttpClient.create(connectionProvider)
|
|
|
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, HTTPCLIENT_CONNECT_TIMEOUT_MILLIS)
|
|
|
+ .responseTimeout(HTTPCLIENT_RESPONSE_TIMEOUT)
|
|
|
+ .secure(spec -> spec.sslContext(sslContext))
|
|
|
+ .doOnConnected(conn -> conn
|
|
|
+ .addHandlerLast(new ReadTimeoutHandler(READ_TIMEOUT))
|
|
|
+ .addHandlerLast(new WriteTimeoutHandler(WRITE_TIMEOUT))
|
|
|
+ );
|
|
|
+
|
|
|
+ // 构建WebClient实例(后续代码无修改)
|
|
|
+ DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
|
|
|
+ factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
|
|
|
+ return WebClient.builder()
|
|
|
+ .exchangeStrategies(ExchangeStrategies.builder()
|
|
|
+ .codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs()
|
|
|
+ .maxInMemorySize(MAX_IN_MEMORY_SIZE))
|
|
|
+ .build())
|
|
|
+ .uriBuilderFactory(factory)
|
|
|
+ .clientConnector(new ReactorClientHttpConnector(httpClient))
|
|
|
+ .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
|
|
+ .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
|
|
|
+ .filter(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
|
|
|
+ log.info("Secure client request: {}", clientRequest.url());
|
|
|
+ clientRequest.headers().forEach((key, values) -> {
|
|
|
+ log.info("请求头: {}: {}", key, values);
|
|
|
+ });
|
|
|
+ return Mono.just(clientRequest);
|
|
|
+ }))
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 根据域名获取对应的SSL上下文
|
|
|
*
|