记录一次Java项目无法使用系统代理的异常

因公司要求,公司内服务器均需要通过代理服务器连接外网。

近期在部署一个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();

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值