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

您所在的位置:网站首页 Java云服务访问内网服务 【JAVA】http连接使用代理(内网环境集成阿里云短信服务范例)

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

2024-07-14 17:37| 来源: 网络整理| 查看: 265

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(


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3