国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

當年玩耍httpclient

lykops / 549人閱讀

摘要:當年玩耍前言是開發中最常用的工具之一,通常大家會使用去調用遠程,使用其中比較基礎的,長期開發爬蟲,會接觸不常用的,同時會遇到各式各樣的坑,下面會總結這些年遇到的坑坑坑坑一解決過程開發某省份移動爬蟲時,加載首頁會報標題錯誤,嘗試各種辦法都不好

當年玩耍httpclient 前言

httpclient是java開發中最常用的工具之一,通常大家會使用httpcilent去調用遠程,使用其中比較基礎的api,長期開發爬蟲,會接觸httpclient不常用的api,同時會遇到各式各樣的坑,下面會總結這些年遇到的坑

坑坑坑 一:Received fatal alert: handshake_failure

解決過程

開發某省份移動爬蟲時,加載首頁會報標題錯誤,嘗試各種辦法都不好使,后來發現換了jdk1.8就好使
經過長達一個星期源碼探尋,發現錯誤源頭是http在握手時,加密算法不支持導致
jdk1.8以下版本不支持256位( TLS_DHE_RSA_WITH_AES_256_CBC_SHA )

解決方案

1、需要下載jce擴展包 http://www.oracle.com/technet...

2、替換/jre/lib/security/里面的兩個jar

3、覆蓋后如果報錯The jurisdiction policy files are not signed by a trusted signer!,

說明下載的版本不對,要下對應jdk版本的

二:Certificates does not conformto algorithm constraints

解決過程

用mvn打包時報錯,
security.cert.CertificateException: Certificates does not conform toalgorithm constraints
原因是在java1.6之后的這個配置文件中,認為MD2的加密方式安全性太低,因而不支持這種加密方式,同時也不支持RSA長度小于1024的密文
需要修改
JAVA_HOME/jre/lib/security/java.security
#jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

但是這樣做需要把每臺機器都改一遍,如果新加機器忘記改了,就會發生問題,需要一套方法,只在代碼層解決問題

解決方案

經查源碼發現了觸發問題的代碼位置,通過強制繼承SSLContextBuilder,并強制把private的keymanagers和trustmanagers的值置空就可以解決這個問題了

static class MySSLContextBuilder extends SSLContextBuilder {
   static final String TLS   = "TLS";
   static final String SSL   = "SSL";
   private String protocol;
   private Set keymanagers;
   private Set trustmanagers;
   private SecureRandom secureRandom;
   public MySSLContextBuilder() {
      super();
      this.keymanagers = new HashSet();
      this.trustmanagers = new HashSet();
   }
}
三:超時時間不生效

解決過程

很多人在使用httpclient時會到網上去找例子,例子中經常會有類似這樣的設置
    httpGet.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, !isAutoRelocal);

使用上面方法時,發送httpclient時,在讀取配置時如果發現getParams不為空,則會把以前設置的所有參數都不用了,而使用這里面設置的,所以超時時間會失效

解決方案

request.getParams().setParameter是過期方法,其中每一項參數在RequestConfig里都有對應的,遍歷出來替換一遍即可

boolean isRedirect = true;
        if(request != null) {
            HttpParams params = request.getParams();
            if (params instanceof HttpParamsNames) {
                // 暫時只支持這個類型
                isRedirect = params.getBooleanParameter(
                        ClientPNames.HANDLE_REDIRECTS, true);
            }
            // 清空request
            request.setParams(new BasicHttpParams());
        }
        if(timeOut > 0) {
            builder = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).setRedirectsEnabled(isRedirect).setCookieSpec(CookieSpecs.BEST_MATCH);
        } else {
            builder = RequestConfig.custom().setConnectionRequestTimeout(connectionTimeout).setConnectTimeout(connectionTimeout).setRedirectsEnabled(isRedirect).setSocketTimeout(socketTimeout).setCookieSpec(CookieSpecs.BEST_MATCH);
        }
四:fildder監聽問題

問題

開發爬蟲經常會使用fildder來監控網絡請求,但是使用httpclient時想用fildder會很難,網上查各種辦法,經常都不好使,
下面為大家來排個錯,使用下面方法就可以完美解決這個問題,讓fildder監控更容易

解決方案

首先java端
// client builder
HttpClientBuilder builder = HttpClients.custom();
if(useFidder) {
            // 默認fidder寫死
            builder.setProxy(new HttpHost("127.0.0.1", 8888));
}
fildder端
tools->fiddler options->https->actions->export root certificate to ... 
inkeytool.exe -import -file C:UsersDesktopFiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
五:支持gzip

問題及方案

有些網站返回進行了gzip壓縮,返回內容是壓縮的結果,需要解壓

HttpClient wrappedHttpClient =  builder.setUserAgent(requestUA)
                .addInterceptorLast(new HttpResponseInterceptor() {
                    @Override
                    public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {
                        HttpEntity httpEntity = httpResponse.getEntity();
                        Header header = httpEntity.getContentEncoding();
                        if (header != null) {
                            for (HeaderElement element : header.getElements()) {
                                if ("gzip".equalsIgnoreCase(element.getName())) {
                                    httpResponse.setEntity(new GzipDecompressingEntity(httpResponse.getEntity()));
                                }
                            }
                        }
                    }
                })
總結
上面一些能想起來的坑,還會遇到很多問題,歡迎來討論
做一個廣告:想簡單開發爬蟲的歡迎使用uncs

作者:劉鵬飛 宜信技術學院

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73176.html

相關文章

  • 三年前舊代碼的重構、總結與反思

    摘要:最近在維護一個三年前的舊代碼,用的是框架。單元測試和語言并發控制實際上是個蛋疼的問題,夸張一點說,當時的并不能特別輕松地實現并發,甚至不能實現并發。語言的功能之一就是自帶單元測試。用語言之前,我的習慣是不寫單元測試。 最近在維護一個三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個代碼算是比較標準為了實現在規定的時間內完成相關功能,同時程序員水平不高、經過大量優化之后,變...

    Shihira 評論0 收藏0
  • 關于降低鎖的競爭程度------從奶爸的角度思考

    摘要:關于降低鎖的競爭程度從奶爸的角度思考題外話這篇文章的靈感來源于近日帶娃耍。具體可參考定律,大致可理解為處理器的利用率與處理器數量和串行比例成反比,此外,在鎖上發生競爭,導致上下文切換的開銷增加,進而降低程序的性能。 關于降低鎖的競爭程度------從奶爸的角度思考 題外話:這篇文章的靈感來源于近日帶娃耍。 鎖競爭帶來的問題 在鎖上發生競爭,導致串行操作花費的時間比例增加,進而降低程序...

    YacaToy 評論0 收藏0
  • 小李飛刀:python請與我一起愉快的玩耍吧!

    摘要:屬性,可以函數的名字在代碼運行期間動態增加功能的方式,稱之為裝飾器。本質上,就是一個返回函數的高階函數。比如,定義一個能打印日志的。接受函數作為參數,要放置在函數定義處。一個完整的的代碼如下記錄的是傳入的的值,位置在嵌套內或者帶參數的如下。 又是一段叨叨 如果總是擔心能不能做到的話,那就干脆不要做了。想做的事情還是一往無前的好,什么都不想,就努力沖沖沖吧! 裝飾器 因為函數是一個對象。...

    FuisonDesign 評論0 收藏0
  • HttpClient4.3.x使用-基礎篇

    摘要:自定義是請求響應式的,本是無狀態的,不過應用通常需要在幾個連續的請求之間保持聯系,因此可以使用這個來傳遞變量,注意這個不是線程安全的,建議每個線程使用一個。這個方法是線程安全的,而且可以從任意線程中調用。協議攔截器必須實現為線程安全的。 1、關閉流和response CloseableHttpClient httpclient = HttpClients.createDefault()...

    cartoon 評論0 收藏0
  • Java11 HttpClient小試牛刀

    序 本文主要研究一下Java11的HttpClient的基本使用。 變化 從java9的jdk.incubator.httpclient模塊遷移到java.net.http模塊,包名由jdk.incubator.http改為java.net.http 原來的諸如HttpResponse.BodyHandler.asString()方法變更為HttpResponse.BodyHandlers.of...

    Bmob 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<