【JAVA】http连接使用代理(内网环境集成阿里云短信服务范例)

本文主要探讨在内网环境下,如何解决Java应用通过透明代理访问阿里云短信服务的问题。首先介绍了问题背景,然后详细讲解了两种实现方法:1) 使用System.properties设置全局代理,但可能影响其他连接;2) 利用Apache HttpClient实现针对特定连接的代理设置,更安全可控。最后给出了集成阿里短信服务的示例,并提醒读者避免直接修改SDK的jar包。
摘要由CSDN通过智能技术生成

1.问题描述

笔者做的项目服务:启动在内网环境中,一切外网相关的链接都需要走透明代理。
阿里云sdk:封装好与http相关的所有操作,我们没办法去配置http相关的设置。
针对问题一:内网服务访问外网走代理?
针对问题二:如何在java代码中设置http连接代理?
问题二这就是本篇博文的主题,全文以jdk8作为示例。

2.实现方法

(1)使用System.properties

//使用HTTP
System.setProperty("http.proxyHost", "xxx.xxx.xxx");//填写你的代理ip
System.setProperty("http.proxyPort", "8080");//填写你的代理端口
(oracle相关文档并没有proxySet属性,无需添加)
(如果有相关密码验证,这里不做赘述)
//使用HTTPS
System.setProperty("https.proxyHost", "webcache.example.com");
System.setProperty("https.proxyPort", "443");

//补充,使用http.nonProxyHosts 这个属性中地址会直接访问不会经过代理
System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1|*.local|")

优点:

  • 简单快捷,两条语句能够让http连接走代理。
  • 前提使用HTTP是不需要更改阿里sdk,没有看到阿里云sdk能够切换http/https的设置。

缺点:

  • 一旦设置了全局System代理字段进行设置,所有的连接都会使用代理去访问。当然可以去配置http.nonProxyHosts,但是当系统中有代理访问不到ip时就会有问题了。

那么可以不可以使用完以后关闭代理呢?

System.setProperty("http.proxyHost", "xxx.xxx.xxx");//填写你的代理ip
System.setProperty("http.proxyPort", "8080");//填写你的代理端口
//http请求(使用代理)
System.clearProperty("http.proxyHost");
//http请求(已经没有代理了)

如果你的程序是单线程,那么这样没有问题。
如果程序是多线程,没办法保证在clearProperty之前是否会有别的线程走代理,那么是有问题的。
但是如果代理能够访问到所有线程请求的ip,那么这么做也无妨。

(2)终极解决方案:针对连接使用代理
这里使用Apache的HttpClient作为演示:

        HttpHost proxy = new HttpHost(PROXY_IP, PROXY_PORT, "http");
        System.out.println("【代理信息】ip:" + PROXY_IP + "port:" + PROXY_PORT);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        RequestConfig requestConfig = RequestConfig.custom()
	        .setConnectTimeout(5000)  //设置连接建立超时的时间
	        .setConnectionRequestTimeout(5000)
	        .setSocketTimeout(5000) 
	        .setProxy(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值