摘要:如果服務(wù)器證書(shū)這兩者不合法而我們又必須讓其校驗(yàn)通過(guò),則可以自己實(shí)現(xiàn)。這個(gè)屬性是新加的屬性,因?yàn)槟壳鞍姹臼强梢怨蚕磉B接池的。請(qǐng)求獲取數(shù)據(jù)的超時(shí)時(shí)間,單位毫秒。如果訪問(wèn)一個(gè)接口,多少時(shí)間內(nèi)無(wú)法返回?cái)?shù)據(jù),就直接放棄此次調(diào)用。
/**
com.alibaba fastjson 1.2.47 org.apache.httpcomponents httpclient 4.5.9 commons-lang commons-lang 2.6 org.projectlombok lombok 1.16.18
*/
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
public class httpClientUtil {
//采用繞過(guò)驗(yàn)證的方式處理https請(qǐng)求 // SSLContext sslcontext = createIgnoreVerifySSL(); public static CloseableHttpClient getIgnoeSSLClient() throws Exception { SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { return true; } }).build(); //CloseableHttpClient client = HttpClients.createDefault();*/ //設(shè)置協(xié)議http和https對(duì)應(yīng)的處理socket鏈接工廠的對(duì)象 RegistrysocketFactoryRegistry = RegistryBuilder. create() .register("http", PlainConnectionSocketFactory.INSTANCE) .register("https", new SSLConnectionSocketFactory(sslContext)) .build(); //HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(rrrr); PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); //創(chuàng)建httpClient CloseableHttpClient client = HttpClients.custom() .setSSLContext(sslContext).setConnectionManager(connManager). setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); return client; } public final static void main(String[] args) throws Exception { CloseableHttpClient httpClient =getIgnoeSSLClient(); CloseableHttpClient httpClient1 = null; // try { /* // 加載自定義的keystore // SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new File("D:/java/IdeaProjects/test/src/main/resources/certs/my.keystore"), "123456".toCharArray()).build(); SSLContext sslContext = createIgnoreVerifySSL(); // 默認(rèn)的域名校驗(yàn)類(lèi)為DefaultHostnameVerifier,比對(duì)服務(wù)器證書(shū)的AlternativeName和CN兩個(gè)屬性。 // 如果服務(wù)器證書(shū)這兩者不合法而我們又必須讓其校驗(yàn)通過(guò),則可以自己實(shí)現(xiàn)HostnameVerifier。 SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() { public boolean verify(String s, SSLSession sslSession) { // 我們可以重寫(xiě)域名校驗(yàn)邏輯 return true; } }); // 一個(gè)httpClient對(duì)象對(duì)于https僅會(huì)選用一個(gè)SSLConnectionSocketFactory // 至少在4.5.3和4.5.4中,如果給HttpClient對(duì)象設(shè)置ConnectionManager,我們必須在PoolingHttpClientConnectionManager的構(gòu)造方法中傳入Registry, // 并將https對(duì)應(yīng)的工廠設(shè)置為我們自己的SSLConnectionSocketFactory對(duì)象,因?yàn)樵贒efaultHttpClientConnectionOperator.connect()中,邏輯是從這里找SSLConnectionSocketFactory的。 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder. create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslConnectionSocketFactory) .build()); connectionManager.setMaxTotal(20); connectionManager.setDefaultMaxPerRoute(20); httpClient1 = HttpClients.custom() // 不在connectionManager中注冊(cè),僅在這里設(shè)置SSLConnectionSocketFactory是無(wú)效的,詳見(jiàn)build()內(nèi)部邏輯,在connectionManager不為null時(shí),不會(huì)使用里的SSLConnectionSocketFactory .setSSLSocketFactory(sslConnectionSocketFactory) .setConnectionManager(connectionManager) .build();*/ /* httpClient = getIgnoeSSLClient(); HttpGet httpGet = new HttpGet("https://www.12306.cn"); System.out.println("Executing request " + httpGet.getRequestLine()); CloseableHttpResponse response = httpClient.execute(httpGet); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8")); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != httpClient) { httpClient.close(); } } catch (Exception e) { e.printStackTrace(); } }*/ String body = ""; /* //采用繞過(guò)驗(yàn)證的方式處理https請(qǐng)求 SSLContext sslcontext = createIgnoreVerifySSL(); //設(shè)置協(xié)議http和https對(duì)應(yīng)的處理socket鏈接工廠的對(duì)象 Registry socketFactoryRegistry = RegistryBuilder. create() .register("http", PlainConnectionSocketFactory.INSTANCE) .register("https", new SSLConnectionSocketFactory(sslcontext)) .build(); PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); HttpClients.custom().setConnectionManager(connManager); //創(chuàng)建自定義的httpclient對(duì)象 CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build(); //CloseableHttpClient client = HttpClients.createDefault();*/ try{ //創(chuàng)建post方式請(qǐng)求對(duì)象 HttpPost httpPost = new HttpPost("https://www.douban.com/service/apikey/apply");//https://api.douban.com/v2/book/1220562 //指定報(bào)文頭Content-type、User-Agent httpPost.setHeader("Content-type", "application/x-www-form-urlencoded"); httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2"); //setConnectTimeout:設(shè)置連接超時(shí)時(shí)間,單位毫秒。 //setConnectionRequestTimeout:設(shè)置從connect Manager獲取Connection 超時(shí)時(shí)間,單位毫秒。這個(gè)屬性是新加的屬性,因?yàn)槟壳鞍姹臼强梢怨蚕磉B接池的。 //setSocketTimeout:請(qǐng)求獲取數(shù)據(jù)的超時(shí)時(shí)間,單位毫秒。 如果訪問(wèn)一個(gè)接口,多少時(shí)間內(nèi)無(wú)法返回?cái)?shù)據(jù),就直接放棄此次調(diào)用。 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(5000).build(); httpPost.setConfig( requestConfig); //apikey: "0b2bdeda43b5688921839c8ecb20399b" Map params = new HashMap (); params.put("apikey","0b2bdeda43b5688921839c8ecb20399b"); StringEntity stringEntity = new StringEntity(JSON.toJSONString(params),"utf-8"); httpPost.setEntity(stringEntity); //執(zhí)行請(qǐng)求操作,并拿到結(jié)果(同步阻塞) CloseableHttpResponse response = httpClient.execute(httpPost); //獲取結(jié)果實(shí)體 HttpEntity entity = response.getEntity(); if (entity != null) { //按指定編碼轉(zhuǎn)換結(jié)果實(shí)體為String類(lèi)型 body = EntityUtils.toString(entity, "UTF-8"); } EntityUtils.consume(entity); //釋放鏈接 response.close(); System.out.println("body:" + body); }finally{ httpClient.close(); } } public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException { SSLContext sc = SSLContext.getInstance("SSLv3"); // 實(shí)現(xiàn)一個(gè)X509TrustManager接口,用于繞過(guò)驗(yàn)證,不用修改里面的方法 X509TrustManager trustManager = new X509TrustManager() { public void checkClientTrusted( java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException { } public void checkServerTrusted( java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException { } public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } }; sc.init(null, new TrustManager[] { trustManager }, null); return sc; }
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75739.html
摘要:序本文從里頭摘出訪問(wèn)的源碼,展示一下怎么用去訪問(wèn)。其中指定要不要檢驗(yàn),如果不校驗(yàn),則是使用小結(jié)使用不去驗(yàn)證,但是可能存在風(fēng)險(xiǎn)構(gòu)造 序 本文從spring cloud netflix zuul里頭摘出httpclient訪問(wèn)https/http的源碼,展示一下怎么用httpclient去訪問(wèn)https。 newConnectionManager protected PoolingHttp...
摘要:此時(shí)我想到了福爾摩斯說(shuō)過(guò)的一句話當(dāng)你排除掉各種不可能出現(xiàn)的情況之后,剩下的情況無(wú)論多么難以置信,都是真相。福爾摩斯冷靜下來(lái)想一想,這個(gè)線程,有可能靜悄悄地退出了嗎,沒(méi)留下半點(diǎn)異常日志從理論上來(lái)說(shuō),不可能。配置建議最后,附上一份配置建議。 1、事發(fā) 我們有個(gè)視頻處理程序,基于 SpringBoot,會(huì)啟動(dòng)幾個(gè)線程來(lái)跑。要退出程序時(shí),會(huì)發(fā)送一個(gè)信號(hào)給程序,每個(gè)線程收到信號(hào)后會(huì)平滑退出,等全...
摘要:?jiǎn)栴}最近項(xiàng)目上面遇到和對(duì)接,測(cè)試庫(kù)他們使用的是,但是正式庫(kù)使用的是。之前沒(méi)有做過(guò),在網(wǎng)上找過(guò)好多文章,最后還是借鑒別人的,自己重新封裝之后才在項(xiàng)目上面使用。以上是我在項(xiàng)目上面使用的,沒(méi)有添加全部的代碼,但是對(duì)應(yīng)的方法都是可以使用的。 問(wèn)題: 最近項(xiàng)目上面遇到和App對(duì)接,測(cè)試庫(kù)他們使用的是 HTTP,但是正式庫(kù)使用的是 HTTPS。之前沒(méi)有做過(guò),在網(wǎng)上找過(guò)好多文章,最后還是借鑒別人的,...
摘要:命令行時(shí)返回值為,標(biāo)準(zhǔn)輸入輸出均指向終端可用進(jìn)程號(hào)查看。會(huì)在腳本執(zhí)行完畢后關(guān)閉三個(gè)流,無(wú)需用戶(hù)手動(dòng)關(guān)閉。與遠(yuǎn)程網(wǎng)址交互是一個(gè)請(qǐng)求和響應(yīng)的過(guò)程,其中細(xì)節(jié)可參考本人之前的文章回顧之請(qǐng)求和回顧之響應(yīng),也可參考協(xié)議的權(quán)威文檔。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) ses...
摘要:鑒于它還處在,如果不是著急使用,建議還是使用的,它是遵循規(guī)范的,使用起來(lái)更加方便。貌似要在版本才支持。揭秘讓支持協(xié)議如何啟用命令支持 序 本文主要研究下JEP 110: HTTP/2 Client (Incubator) 基本實(shí)例 sync get /** * --add-modules jdk.incubator.httpclient * @throws ...
閱讀 3998·2021-11-22 09:34
閱讀 1522·2021-11-04 16:10
閱讀 1760·2021-10-11 10:59
閱讀 3300·2019-08-30 15:44
閱讀 2071·2019-08-30 13:17
閱讀 3480·2019-08-30 11:05
閱讀 775·2019-08-29 14:02
閱讀 2648·2019-08-26 13:34