在做Android客户端通过https协议访问12306,并爬取数据时,出现了如下错误:

其中有一条错误提示是javax.net.ssl.SSLPeerUnverifiedException:Nopeercertificate的异常。现给出解决方法。

写了一个自定义类继承SSLSocketFactory

importjava.io.IOException;

importjava.net.Socket;

importjava.net.UnknownHostException;

importjava.security.KeyManagementException;

importjava.security.KeyStore;

importjava.security.KeyStoreException;

importjava.security.NoSuchAlgorithmException;

importjava.security.UnrecoverableKeyException;

importjavax.net.ssl.SSLContext;

importjavax.net.ssl.TrustManager;

importjavax.net.ssl.X509TrustManager;

importorg.apache.http.conn.ssl.SSLSocketFactory;

publicclassSSLSocketFactoryExextendsSSLSocketFactory{

SSLContextsslContext=SSLContext.getInstance("TLS");

publicSSLSocketFactoryEx(KeyStoretruststore)

throwsNoSuchAlgorithmException,KeyManagementException,

KeyStoreException,UnrecoverableKeyException{

super(truststore);

TrustManagertm=newX509TrustManager(){

publicjava.security.cert.X509Certificate[]getAcceptedIssuers(){returnnull;}

@Override

publicvoidcheckClientTrusted(

java.security.cert.X509Certificate[]chain,StringauthType)

throwsjava.security.cert.CertificateException{}

@Override

publicvoidcheckServerTrusted(

java.security.cert.X509Certificate[]chain,StringauthType)

throwsjava.security.cert.CertificateException{}

};

sslContext.init(null,newTrustManager[]{tm},null);

}

@Override

publicSocketcreateSocket(Socketsocket,Stringhost,intport,booleanautoClose)throwsIOException,UnknownHostException{

returnsslContext.getSocketFactory().createSocket(socket,host,port,autoClose);

}

@Override

publicSocketcreateSocket()throwsIOException{

returnsslContext.getSocketFactory().createSocket();

}

}

再来看看如何做回调:

publicstaticHttpClientgetNewHttpClient(){

try{

KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());

trustStore.load(null,null);

SSLSocketFactorysf=newSSLSocketFactoryEx(trustStore);

sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

HttpParamsparams=newBasicHttpParams();

HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);

HttpProtocolParams.setContentCharset(params,HTTP.UTF_8);

SchemeRegistryregistry=newSchemeRegistry();

registry.register(newScheme("http",PlainSocketFactory.getSocketFactory(),80));

registry.register(newScheme("https",sf,443));

ClientConnectionManagerccm=newThreadSafeClientConnManager(params,registry);

returnnewDefaultHttpClient(ccm,params);

}catch(Exceptione){

returnnewDefaultHttpClient();

}

}

现在就可以拿这个HTTPClient去请求数据了

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android客户端与服务器之间传递json数据
  3. Android实现简单的电子词典
  4. Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发
  5. Android(安卓)Studio关于USB device not found的解决办法
  6. android简单实例---------SharedPreferences的简单使用与讲解
  7. android SQLiteDatabase
  8. Android简单实现BroadCastReceiver广播机制
  9. Android(安卓)的第三方报表组件,AChartEngine 案列demo

随机推荐

  1. Android(安卓)startservice & bindservic
  2. Eclipse下Android更新升级过程中遇到的问
  3. android中四大组件之间相互通信
  4. Android的四大天王
  5. manifest文件
  6. Android(安卓)一个supportsRtl属性 RTl是
  7. [Android] Android(安卓)视频播放总结
  8. android中textview控件中的文字的位置是
  9. Android(安卓)浏览器内核浅谈
  10. Android(安卓)的消息队列模型