在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP。

http很简单,但是https这样会报错。

问题:如何使用代理发送https请求?

客户端发送https请求之前会先向这台服务器请求ssl证书,并在客服端对这个证书做一个校验。

而使用代理IP时,实际上请求打到了这个代理IP上,而客户端并不知道这件事,他仍然在等待url域名中所对应的ssl证书,而这代理ip对应的服务器实际上并没有这个证书,导致了https请求失败。

解决方法:

HttpClient中有一个    类,里面的方法中包含了需要验证的所有ssl证书类型,而我们只需要重写这个方法,并把需要验证的证书设置为空,即命令客户端不验证任何ssl证书,就ok了。

关于http请求头中的host字段:

https://blog.csdn.net/yzpbright/article/details/51052008

代码:

 private JSONObject HttpPing(String dns, String uri, String qlb, String scheme) {
String url = scheme + "://" + dns + uri;
CloseableHttpClient httpclient = null;
if (scheme.equals("http")) {
httpclient = getHttpClient(qlb);
} else if (scheme.equals("https")) {
httpclient = getHttpsClient(qlb);
} else{
return null;
}
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse httpResp = null;
try {
httpResp = httpclient.execute(httpGet);
} catch (IOException e) {
e.printStackTrace();
}
try {
int statusCode = httpResp.getStatusLine().getStatusCode();
if (statusCode == org.apache.http.HttpStatus.SC_OK) {
return JSONObject.parseObject(EntityUtils.toString(httpResp.getEntity(), "UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpResp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
  private CloseableHttpClient getHttpClient(String qlb) {
HttpHost proxy = new HttpHost(qlb, 80, "http");
//把代理设置到请求配置
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setProxy(proxy)
.build();
CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
return httpclient;
} private CloseableHttpClient getHttpsClient(String qlb) {
    //这里设置客户端不检测服务器ssl证书
try {
X509TrustManager x509mgr = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) {
}
public void checkServerTrusted(X509Certificate[] xcs, String string) {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { x509mgr }, null);
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpHost proxy = new HttpHost(qlb, 443, "https");
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setProxy(proxy)
.build();
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(defaultRequestConfig).build();
return httpclient;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

最新文章

  1. Jexus-5.6.3使用详解、Jexus Web Server配置
  2. 从零开始搭建Docker Swarm集群
  3. 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
  4. Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标
  5. 单例模式在Unity中的应用
  6. 分析智能卡的ATR格式
  7. C - Courses - hdu 1083(模板)
  8. [HTML5] Level up -- Display
  9. 【STM32】用DMA实现多路ADC通道数据采集
  10. c# 搭建服务端 传输协议(2)
  11. python学习笔记之11:图像用户界面
  12. mysql分割逗号办法
  13. React 简介及其基本使用
  14. [ 10.4 ]CF每日一题系列—— 486C
  15. Android JNI 学习(十):String Operations Api & Other Apis
  16. docker 7 docker的帮助命令
  17. Android的Databinding-需要使用控件id,listener以及布局有include的场景
  18. 结对项目-四则运算"软件"之升级版
  19. Dynamics CRM 2011 快速查找 出现异常 QuickFindQueryRecordLimit exceeded. Cannot perform this operation 的解决方法
  20. arm-linux-gcc配置安装

热门文章

  1. JS BOM(浏览器对象)
  2. linu基础命令1
  3. C#学习笔记四(LINQ,错误和异常,异步编程,反射元数据和动态编程)
  4. 【VS开发】【智能语音处理】语音信号处理之(一)动态时间规整(DTW)
  5. javascrpt的string和Boolean类型
  6. Akka系列(七):Actor持久化之Akka persistence
  7. Leetcode 35.搜索插入位置 By Python
  8. 小记-----如何把本地jar包加载到maven库中
  9. ZOJ 2836 Number Puzzle 题解
  10. C++中的多重继承(一)