記一次HTTPClient模擬登錄獲取Cookie的開發歷程
環境:
? springboot : 2.7
? jdk: 1.8
? httpClient : 4.5.13
設計方案
? 通過新建一個空的cookie庫創建出一個Http客戶端,然后通過此客戶端呼叫登錄介面模擬登錄拿到cookie資料,登錄成功 cookie會自動存盤到我們之前新建的空cookie庫中,將此cookie庫保存下來,后續其他介面呼叫每次都通過這個登錄成功的cookie庫創建出新的http客戶端來發起http訪問,
代碼實作:
/**
* 每個cookie只能系結一個客戶端,提供這個方法用于給cookie生成http客戶端
*
* @param basicCookieStore: cookie
* @Author: sanghaiquan
* @Date: 2022/11/9 10:45
* @return: org.apache.http.impl.client.CloseableHttpClient
**/
private static CloseableHttpClient getHttpsClient(BasicCookieStore basicCookieStore) throws KeyManagementException, NoSuchAlgorithmException {
CloseableHttpClient httpClient = null;
SSLContext sslContext = SSLContext.getInstance("TLS");
X509TrustManager x509TrustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[]{x509TrustManager}, null);
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslContext,
new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"},
null,
NoopHostnameVerifier.INSTANCE
);
httpClient = HttpClients.custom()
// 設定跳過SSL認證
.setSSLSocketFactory(sslConnectionSocketFactory)
// 設定客戶端默認的cookie
.setDefaultCookieStore(basicCookieStore)
// 每個route默認的最大連接數
.setMaxConnPerRoute(100)
// 總的連接池最大連接數
.setMaxConnTotal(500)
.build();
return httpClient;
}
問題記錄:
? 獲取到的cookiestore由于內部結構原因,無法被redis正常反序列化,如果需要將cookie持久化存盤,那么就需要將cookiestore中的cookiesGet獲取出來,并轉換成list
? 并且在撰寫代碼程序中,list
存疑點:
? 1.頻繁使用cookie創建新的httpclient是否會影響性能?
? 2.有沒有使用唯一的一個httpclient每次去新的cookiestore的辦法,類似于Token機制一樣,只需要創建一個默認的httpclient即可,全域通過,無需頻繁創建銷毀httpclient,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531433.html
標籤:其他
