当年玩耍httpclient

栏目: Java · 发布时间: 7年前

内容简介:request.getParams().setParameter是过期方法,其中每一项参数在RequestConfig里都有对应的,遍历出来替换一遍即可有些网站返回进行了gzip压缩,返回内容是压缩的结果,需要解压

前言

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Usability for the Web

Usability for the Web

Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95

Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具