一、原生API依赖引用
注意不要引用错误,否则会引发诡异错误。
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import sun.net.www.protocol.https.Handler;
二、自定义TrainX509TrustManager
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class TrainX509TrustManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
三、示例代码
public String readURLByHttpsGet(String url, String charset) throws Exception {
//发送https前的准备工作
TrustManager[] tm = { new TrainX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
String content = "";
// 尝试连10次
boolean suc = false ;
for (int i = 0; i < 10; i++) {
try {
// URL net = new URL(url);//此法会抛异常
URL net = new URL(null,url,new Handler());//重要,必须要传入new Handler(),否则会抛异常
InputStream in = null;
HttpsURLConnection conn = (HttpsURLConnection) net.openConnection();//重要
conn.setSSLSocketFactory(ssf);//重要
conn.setConnectTimeout(60000);
conn.setReadTimeout(60000);
in = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, charset));
StringBuffer sb = new StringBuffer();
int ch;
while ((ch = br.read()) != -1) {
sb.append((char) ch);
}
in.close();
content = sb.toString();
suc = true;
break;
} catch (Exception e) {
e.printStackTrace();
if (i == 9) {
break;
}
continue;
}
}
if(!suc){
throw new Exception("读取 失败:"+url) ;
}
return content;
}