因公司要求,公司内服务器均需要通过代理服务器连接外网。
近期在部署一个SpringBoot项目时,发现一个从公网地址拉取数据的功能报ConnectionRefused。
经检查,配置的系统代理和JVM代理均生效了,这让我疑惑了很久...
后来发现是使用的HttpClientBuilder不会默认读取环境变量,需要手动设置环境变量的使用,或者手动配置代理。
以下是我的配置方法(包含了绕过SSL认证的过程,当时就是为了使用这个功能才选用了HttpClientBuilder构建httpClient...):
//1、构建HttpClient的部分
CloseableHttpClient closeableHttpClient = null;
try {
SSLContext sslContext = SSLContextBuilder.create().setProtocol(SSLConnectionSocketFactory.SSL).loadTrustMaterial((x, y) -> true).build();
RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build();
HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(config).setSSLContext(sslContext).setSSLHostnameVerifier((x, y) -> true);
if(StringUtils.equalsIgnoreCase(useProxy,"true")){
this.setProxy(this.proxyHost,this.proxyPort,this.noproxy);
builder.useSystemProperties();
}
closeableHttpClient = builder.build();
} catch (Exception e) {
e.printStackTrace();
}
//2、配置JVM环境变量的部分,网上有两种配置方法效果应该是一样的
private void setProxy(String host, String port, String noproxy){
logger.info("设置代理服务器");
//配置方法A
System.setProperty("http.proxySet", "true");
// 设置http访问要使用的代理服务器的地址
System.setProperty("http.proxyHost", host);
// 设置http访问要使用的代理服务器的端口
System.setProperty("http.proxyPort", port);
// 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
System.setProperty("http.nonProxyHosts", noproxy);
// 设置http访问要使用的代理服务器的地址
System.setProperty("https.proxyHost", host);
// 设置http访问要使用的代理服务器的端口
System.setProperty("https.proxyPort", port);
// 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
System.setProperty("https.nonProxyHosts", noproxy);
//配置方法B
System.getProperties().put("http.proxySet", "true");
// 设置http访问要使用的代理服务器的地址
System.getProperties().put("http.proxyHost", host);
// 设置http访问要使用的代理服务器的端口
System.getProperties().put("http.proxyPort", port);
// 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
System.getProperties().put("http.nonProxyHosts", noproxy);
// 设置http访问要使用的代理服务器的地址
System.getProperties().put("https.proxyHost", host);
// 设置http访问要使用的代理服务器的端口
System.getProperties().put("https.proxyPort", port);
// 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
System.getProperties().put("https.nonProxyHosts", noproxy);
}
当然,也可以用HttpClient的setProxy方法手动设置代理。
CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(config)
.setProxy(new HttpHost("proxy.***.com",8080,"http"))
.build();