当年用httpclient时踩过的那些坑

举报
橘座 发表于 2019/09/05 21:44:19 2019/09/05
【摘要】

前言

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/technetwork/cn/java/javase/downloads/jce-7-download-432124.html


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<keymanager> keymanagers;

   private Set<trustmanager> trustmanagers;

   private SecureRandom secureRandom;

   public MySSLContextBuilder() {

      super();

      this.keymanagers = new HashSet<keymanager>();

      this.trustmanagers = new HashSet<trustmanager>();

   }

}

三:超时时间不生效

解决过程

很多人在使用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 ... 

<jdk_home>\bin\keytool.exe -import -file C:\Users\<username>\Desktop\FiddlerRoot.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

```</username></jdk_home></trustmanager></keymanager></trustmanager></keymanager>



文章转自异步社区

原文链接  https://www.epubit.com/articleDetails?id=N8e716589-50fd-4d91-a1f5-1096c5e2dcac


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。