java——HttpClient 代理模式发送Http Https
在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的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- Java学习——代理模式
Java中的三种代理模式 一,什么是代理模式? 代理模式是一种设计模式,简单的来说就是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing ...
- 【Java】代理模式、反射机制-动态代理
关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...
- 通俗易懂的讲解一下Java的代理模式
一.基本概念 代理模式是对象的结构模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用) 二.静态代理 静态代理是指,代理类在程序运行前就已经定义好,其与**目标类 ...
- Java的代理模式
最近在学习Spring,关于Spring AOP的代理模式不是很了解,看了一篇博文就懂了. https://www.cnblogs.com/cenyu/p/6289209.html Java的三种代理 ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- java之代理模式
静态代理: java代理是一种模式--代理模式.采用代理模式,可以在不改变目标类代码的基础上,通过代理对象,来增加额外的功能(比如增加日志检测等)或者只需要目标对象的部分行为. java中,代理分为静 ...
- java 之 代理模式(大话设计模式)
java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...
随机推荐
- Opencv中copyTo()函数的使用方法
在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明它的作用.我们要注意mask的数据类型,必须是CV_ ...
- 小型自动化运维工具pssh和传输工具rsync
一.简单介绍 1.pssh全称是parallel-ssh,基于Python编写的并发在多台服务器上批量执行命令的工具.包括pssh,pscp,prsync,pnuke和pslurp.该项目包括pssh ...
- word2vec原理浅析
1.word2vec简介 word2vec,即词向量,就是一个词用一个向量来表示.是2013年Google提出的.word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型( ...
- Java应用监控利器JMX
啥是 JMX? The Java Management Extensions (JMX) API is a standard API for management and monitoring of ...
- java中enum----枚举的学习(更新中)
package com.hdmaxfun; import java.util.Scanner; import com.icpc.Icpm; import java.util.HashMap; impo ...
- Pikachu漏洞练习平台实验——XSS(二)
概述 简介 XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户 XSS漏洞可以用来进行钓鱼攻击.前端js挖矿.盗取用户cookie,甚至对主机进行远程控制 攻击流程 假设存在漏洞的是 ...
- redis漏洞攻击
参考: https://www.cnblogs.com/kobexffx/p/11000337.html 利用redis漏洞获得root权限,挖矿. 解决方法: 用普通帐号启redis,用云的redi ...
- C++对象在继承情况下的内存布局
1,C++ 中继承是非常重要的一个特性,本节课研究在继承的情形下,C++ 的对象模 型又有什么不同: 2,继承对象模型(最简单的情况下): 1,在 C++ 编译器的内部类可以理解为结构体: 2,子类是 ...
- document与Object的关系
window与Objet 1. window.__proto__ === Window.prototype 2. window.__proto__.__proto__ === 窗口属性(WindowP ...
- go相关资料
1.go的调度2.go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型 3.go defer(for defe ...