Java api 的HttpURConnection可以进行普通的http请求发送响应接受,但是面对实现SSL的https时候就无能为力了,不过没关系,java api提供了支持https请求的HttpsURLConnection接口,接下来简单的说一下用法。
其中,HttpsTrustManager实现了javax.net.ssl.X509TrustManager接口,HttpsHostNameVerifier实现了javax.net.ssl.HostnameVerifier接口,代码如下:
javax.net.ssl.HttpsURLConnection继承自java.net.HttpURLConnection,用法和后者基本一样,知识在使用之前还需要几步操作:
SSLSocketFactory sslSocketFactory = null;
try {
TrustManager[] trustManagers = { new HttpsTrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, new SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e2) {
e2.printStackTrace();
}
URL url = new URL(String s);
httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);
httpsURLConnection.setHostnameVerifier(new HttpsHostNameVerifier());
其中,HttpsTrustManager实现了javax.net.ssl.X509TrustManager接口,HttpsHostNameVerifier实现了javax.net.ssl.HostnameVerifier接口,代码如下:
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
/**
* <pre>
* 重写HostNameVerifier的verify方法
* 返回true代表任何host都返回true
* </pre>
*
* Created by Xuyh on 2016/12/8.
*/
public class HttpsHostNameVerifier implements HostnameVerifier {
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}
HttpsHostNameVerifier实现,其中的verify方法返回值为true代表所有host情况下都返回true
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* 自定义实现信任管理器
* <pre>
* 管理信任的数字证书
* 如果实现方法不修改,则默认信任所有HTTPS站点的数字证书
* </pre>
*
* Created by Xuyh on 2016/12/8.
*/
public class HttpsTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
HttpsTrustManager实现。