目录
1. 添加pom依赖
2. 添加restTemplate配置
3. 线程池配置
4. 总结
正文
1. 添加pom依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
2. 添加restTemplate配置
2.1. RestClientConfig
package com.common.config;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
@Configuration
public class RestClientConfig {
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory(ThreadPoolTaskExecutor threadPoolTaskExecutor) {
// 创建信任所有证书的SSL上下文
SSLContext sslContext;
try {
sslContext = SSLContexts.custom()
.loadTrustMaterial(new TrustSelfSignedStrategy())
.build();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (KeyStoreException e) {
throw new RuntimeException(e);
} catch (KeyManagementException e) {
throw new RuntimeException(e);
}
// 创建不验证主机名的SSL连接工厂
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
// 创建HttpClient并配置SSL连接工厂和超时设置
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.build();
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(10000);
httpRequestFactory.setConnectTimeout(10000);
httpRequestFactory.setReadTimeout(10000);
httpRequestFactory.setHttpClient(httpClient);
return httpRequestFactory;
}
@Bean("restTemplate")
public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(clientHttpRequestFactory);
return restTemplate;
}
}
2.2. NoopHostnameVerifier 用于2.1中生成RestTemplate
package com.common.config;
import javax.net.ssl.*;
public class NoopHostnameVerifier implements HostnameVerifier {
public static final HostnameVerifier INSTANCE = new NoopHostnameVerifier();
@Override
public boolean verify(String hostname, SSLSession session) {
return true; // 总是接受主机名验证
}
}
3. 线程池配置
此处线程池配置可以不进行添加。restTemplate已经可以使用。
若要添加线程池的使用可借鉴 这篇文章
restTemplate设置httpClient线程池
4. 总结
调用https的链接需要有证书,没有证书可添加创建信任所有证书的SSL上下文
配置后使用。