在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;
}

java——HttpClient 代理模式发送Http Https的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. Java学习——代理模式

    Java中的三种代理模式 一,什么是代理模式? 代理模式是一种设计模式,简单的来说就是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing ...

  3. 【Java】代理模式、反射机制-动态代理

    关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...

  4. 通俗易懂的讲解一下Java的代理模式

    一.基本概念 代理模式是对象的结构模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用) 二.静态代理 静态代理是指,代理类在程序运行前就已经定义好,其与**目标类 ...

  5. Java的代理模式

    最近在学习Spring,关于Spring AOP的代理模式不是很了解,看了一篇博文就懂了. https://www.cnblogs.com/cenyu/p/6289209.html Java的三种代理 ...

  6. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  7. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  8. java之代理模式

    静态代理: java代理是一种模式--代理模式.采用代理模式,可以在不改变目标类代码的基础上,通过代理对象,来增加额外的功能(比如增加日志检测等)或者只需要目标对象的部分行为. java中,代理分为静 ...

  9. java 之 代理模式(大话设计模式)

    java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...

随机推荐

  1. node递归批量重命名指定文件夹下的文件

    1.用法:将js内容拷到一文件中,命名为batchRename.js:  该文件可以放到任何你想更改文件名的文件夹目录,然后dos(或 linux 终端)进入该文件夹,然后执行node batchRe ...

  2. Asp.Net Webform 常用代码

    1015.ASP.Net WebForm 数据绑定 < %# %>   < %= %>   < % %>  < %@ %> Eval("Nam ...

  3. Elastic search中使用nested类型的内嵌对象

    在大数据的应用环境中,往往使用反范式设计来提高读写性能. 假设我们有个类似简书的系统,系统里有文章,用户也可以对文章进行赞赏.在关系型数据库中,如果按照数据库范式设计,需要两张表:一张文章表和一张赞赏 ...

  4. 卸载openssl后yum无法使用,ssh无法连接的解决办法

    一,安装nginx时,提示openssl版本问题,用yum update openssl 发现还是不行,于是rpm -e 卸载了openssl 此时,才发现yum不能用了,然后想上传个tar包时又出现 ...

  5. springboot笔记之helloworld

    开发工具:IDEA 2019 springboot版本:2.1.9 一.springboot2.x VS 1.x 基础环境升级 最低 JDK 8,支持 JDK 9,不再支持 Java 6 和 7 依赖 ...

  6. springMVC原理简单介绍

    说明: 用户发送请求到DispatcherServlet,即前端控制器 DipatcherServlet调用处理器映射器HandlerMapping解析 处理器映射器HandlerMapping根据请 ...

  7. C++中组合和继承的概念及意义

    1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...

  8. Android-Widget桌面小组件

    1, 掌握Widget的用:Widget的用途,能够添加到手机桌面的程序 2, Widget的特点和用法步骤: 特点:快捷,方便,个性化,可自定义功能,可及时控制更新Widget显示内容 3, 用法步 ...

  9. 前端页面适配的rem换算 为什么要使用rem

    之前有些适配做法,是通过js动态计算viewport的缩放值(initial-scale). 例如以屏幕320像素为基准,设置1,那屏幕375像素就是375/320=1.18以此类推. 但直接这样强制 ...

  10. vscode学习(二)之显示中文异常解决办法

    异常原因:VSCODE默认是UTF-8编码打开文件的.如果遇到了像GB18030 GBK等等的编码,就显示乱码了. 解决办法: 在设置文件中加入:"files.autoGuessEncodi ...