最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

那些年用httpclient時(shí)踩過(guò)的一些坑

 更新時(shí)間:2019年05月24日 11:24:35   作者:宜信技術(shù)  
這篇文章主要給大家介紹了關(guān)于那些年用httpclient時(shí)踩過(guò)的一些坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用httpclient具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

httpclient是java開(kāi)發(fā)中最常用的工具之一,通常大家會(huì)使用其中比較基礎(chǔ)的api去調(diào)用遠(yuǎn)程。長(zhǎng)期開(kāi)發(fā)爬蟲(chóng),會(huì)接觸httpclient不常用的api,同時(shí)會(huì)遇到各式各樣的坑,本文將總結(jié)這些年遇到的坑及相應(yīng)的解決方案。

二、問(wèn)題及解決方案

問(wèn)題1:Received fatal alert: handshake_failure

問(wèn)題背景

開(kāi)發(fā)某省份移動(dòng)爬蟲(chóng)時(shí),加載首頁(yè)會(huì)報(bào)標(biāo)題錯(cuò)誤,嘗試各種辦法都不好使,后來(lái)發(fā)現(xiàn)換了jdk1.8就可以了。經(jīng)過(guò)長(zhǎng)達(dá)一個(gè)星期源碼探尋,發(fā)現(xiàn)錯(cuò)誤源頭是http在握手時(shí),加密算法不支持。

jdk1.8以下版本不支持256位(TLS_DHE_RSA_WITH_AES_256_CBC_SHA )

解決方案

1、下載jce擴(kuò)展包 http://www.oracle.com/technetwork/cn/java/javase/downloads/jce-7-download-432124.html

2、替換/jre/lib/security/里面的兩個(gè)jar

3、覆蓋后如果報(bào)錯(cuò)The jurisdiction policy files are not signed by a trusted signer!,說(shuō)明下載的版本不對(duì),要下對(duì)應(yīng)jdk版本的。

問(wèn)題2:Certificates does not conformto algorithm constraints

問(wèn)題背景

用mvn打包時(shí)報(bào)錯(cuò), security.cert.CertificateException: Certificates does not conform toalgorithm constraints

原因是在java1.6之后的這個(gè)配置文件中,認(rèn)為MD2的加密方式安全性太低,因而不支持這種加密方式,同時(shí)也不支持RSA長(zhǎng)度小于1024的密文。

需要修改 JAVA_HOME/jre/lib/security/java.security #jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

但是這樣做需要把每臺(tái)機(jī)器都改一遍,如果新加機(jī)器忘記改了,就會(huì)繼續(xù)報(bào)錯(cuò)。因此需要一套方法,只在代碼層解決問(wèn)題。

解決方案

經(jīng)查源碼發(fā)現(xiàn)了觸發(fā)問(wèn)題的代碼位置,通過(guò)強(qiáng)制繼承SSLContextBuilder,并強(qiáng)制把private的keymanagers和trustmanagers的值置空就可以解決這個(gè)問(wèn)題了。

代碼如下:

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();
 }
}

問(wèn)題3:超時(shí)時(shí)間不生效

問(wèn)題背景

很多人在使用httpclient時(shí)會(huì)到網(wǎng)上去找例子,例子中經(jīng)常會(huì)有類(lèi)似這樣的設(shè)置

httpGet.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, !isAutoRelocal);

使用上述方法發(fā)送httpclient,在讀取配置時(shí),如果發(fā)現(xiàn)getParams不為空,則會(huì)使得以前設(shè)置的所有參數(shù)都失效,而使用這里設(shè)置的,結(jié)果是導(dǎo)致超時(shí)時(shí)間失效。

解決方案

request.getParams().setParameter是過(guò)期方法,其中每一項(xiàng)參數(shù)在RequestConfig里都有對(duì)應(yīng)的,遍歷出來(lái)替換一遍即可。

boolean isRedirect = true;
  if(request != null) {
   HttpParams params = request.getParams();
   if (params instanceof HttpParamsNames) {
    // 暫時(shí)只支持這個(gè)類(lèi)型
    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);
  }

問(wèn)題4:fildder監(jiān)聽(tīng)問(wèn)題

問(wèn)題背景

開(kāi)發(fā)爬蟲(chóng)經(jīng)常會(huì)使用fildder來(lái)監(jiān)控網(wǎng)絡(luò)請(qǐng)求,但是使用httpclient時(shí)想用fildder會(huì)很難,網(wǎng)上查各種辦法都不好用。

下面為大家來(lái)排個(gè)錯(cuò),使用下面方法就可以完美解決這個(gè)問(wèn)題,讓fildder監(jiān)控更容易。

解決方案

首先java端

// client builder
HttpClientBuilder builder = HttpClients.custom();
if(useFidder) {
   // 默認(rèn)fidder寫(xiě)死
   builder.setProxy(new HttpHost("127.0.0.1", 8888));
}

fildder端

tools->fiddler options->https->actions->export root certificate to ... \bin\keytool.exe -import -file C:\Users\\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler

問(wèn)題5:支持gzip

問(wèn)題及解決方案

有些網(wǎng)站返回進(jìn)行了gzip壓縮,返回內(nèi)容是壓縮的結(jié)果,需要解壓。

代碼如下:

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()));
        }
       }
      }
     }
    })

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • SpringFramework中的數(shù)據(jù)校驗(yàn)方式

    SpringFramework中的數(shù)據(jù)校驗(yàn)方式

    這篇文章主要介紹了SpringFramework中的數(shù)據(jù)校驗(yàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 淺談Spring?中?@EnableXXX?注解的套路

    淺談Spring?中?@EnableXXX?注解的套路

    本文主要介紹了淺談Spring?中?@EnableXXX?注解的套路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java編程探索之泛型擦除實(shí)例解析

    Java編程探索之泛型擦除實(shí)例解析

    這篇文章主要介紹了Java編程探索之泛型擦除實(shí)例解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 淺談Java到底是值傳遞還是引用傳遞呢

    淺談Java到底是值傳遞還是引用傳遞呢

    今天帶大家學(xué)習(xí)Java的相關(guān)知識(shí),文章圍繞著Java到底是值傳遞還是引用傳遞展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java中遞歸、循環(huán)的優(yōu)劣分析

    Java中遞歸、循環(huán)的優(yōu)劣分析

    這篇文章主要給大家介紹了關(guān)于Java中遞歸、循環(huán)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java之Jackson的基本使用案例講解

    Java之Jackson的基本使用案例講解

    這篇文章主要介紹了Java之Jackson的基本使用案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java  自定義注解的實(shí)例詳解

    java 自定義注解的實(shí)例詳解

    這篇文章主要介紹了java 自定義注解的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Servlet實(shí)現(xiàn)點(diǎn)擊計(jì)數(shù)器的方法

    Servlet實(shí)現(xiàn)點(diǎn)擊計(jì)數(shù)器的方法

    這篇文章主要介紹了Servlet實(shí)現(xiàn)點(diǎn)擊計(jì)數(shù)器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • MyBatis詳細(xì)講解DAO代理的使用

    MyBatis詳細(xì)講解DAO代理的使用

    MyBatis允許只聲明一個(gè)dao接口,而無(wú)需寫(xiě)dao實(shí)現(xiàn)類(lèi)的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。前提是必須保證Mapper文件中的<mapper>標(biāo)簽的namespace屬性值必須要和dao接口的類(lèi)路徑一致,MyBatis容器會(huì)自動(dòng)通過(guò)動(dòng)態(tài)代理生成接口的實(shí)現(xiàn)類(lèi)
    2022-04-04
  • java讀取簡(jiǎn)單excel通用工具類(lèi)

    java讀取簡(jiǎn)單excel通用工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了java讀取簡(jiǎn)單excel通用工具類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評(píng)論

泰州市| 万年县| 政和县| 富顺县| 饶河县| 凌云县| 阳高县| 博客| 北流市| 手游| 安阳县| 彝良县| 尤溪县| 楚雄市| 宁城县| 商河县| 新干县| 安仁县| 恩平市| 通许县| 青州市| 武穴市| 临沂市| 婺源县| 建阳市| 馆陶县| 柯坪县| 邻水| 海阳市| 郓城县| 遂平县| 新郑市| 平邑县| 定兴县| 洛南县| 比如县| 东乡县| 阿拉善左旗| 南溪县| 安达市| 格尔木市|