3.6.4 HttpsURLConnection
HttpsURLConnection类继承于HttpURLConnection类。从字面上看,两个类仅差一个字母。但在含义上,HttpsURLConnection类比HttpURLConnection类更具安全性。
/HttpsURLConnection扩展HttpURLConnection,支持各种特定于https功能。/
public abstract class HttpsURLConnection
extends HttpURLConnection
❑方法详述
HttpsURLConnection类的方法有很多,但对于本书将要阐述的内容来讲,主要用到了如下几种方法。
我们可以通过如下方法设置(默认)SSLSocketFactory对象:
/设置当此实例为安全https URL连接创建套接字时使用的SSLSocketFactory。/
public void setSSLSocketFactory(SSLSocketFactory sf)
//设置此类的新实例所继承的默认SSLSocketFactory。
public static void setDefaultSSLSocketFactory(SSLSocketFactory sf)
相应地,我们可以通过如下方法获得(默认)SSLSocketFactory对象:
//获取为安全https URL连接创建套接字时使用的SSL套接字工厂。
public SSLSocketFactory getSSLSocketFactory()
//获取此类的新实例所继承的默认静态SSLSocketFactory。
public static SSLSocketFactory getDefaultSSLSocketFactory()
我们可以通过如下方法获得握手期间相关的证书链:
//返回握手期间发送给服务器的证书。
public abstract Certificate[]getLocalCertificates()
//返回服务器的证书链,它是作为定义会话的一部分而建立的。
public abstract Certificate[]getServerCertificates()
关于Principal类,请读者参考相应的Java API文档,以下是HttpsURLConnection类提供的相应方法:
//返回握手期间发送到服务器的主体。
public Principal getLocalPrincipal()
//返回服务器的主体,它是作为定义会话的一部分而建立的。
public Principal getPeerPrincipal()
以下方法用于获得密码套件:
//返回在此连接上使用的密码套件。
public abstract String getCipherSuite()
关于HostnameVerifier类,请读者朋友参考相应的Java API文档,以下方法用于获得(默认)HostnameVerifier对象:
//获取此类的新实例所继承的默认HostnameVerifier。
public static HostnameVerifier getDefaultHostnameVerifier()
//获取此实例适当的HostnameVerifier。
public HostnameVerifier getHostnameVerifier()
以下方法用于获得(默认)HostnameVerifier对象:
//设置此类的新实例所继承的默认HostnameVerifier。
public static void setDefaultHostnameVerifier(HostnameVerifier v)
//设置此实例的HostnameVerifier。
public void setHostnameVerifier(HostnameVerifier v)
❑实现示例
我们接3.6.3节内容,获得SSLSocketFactory对象后,可完成HttpsURLConnection对象的设置,如代码清单3-29所示:
代码清单3-29 构建HTTPS
//构建URL对象
URL url=new URL("https://www.sun.com/");
//获得HttpsURLConnection实例化对象。
HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
//打开输入模式
conn.setDoInput(true);
//打开输出模式
conn.setDoOutput(true);
//在这里调用前面介绍的configSSLSocketFactory()方法。
//设置SSLSocketFactory
configSSLSocketFactory(conn,"password","D:\x.keystore","D:\x.keystore");
//获得输入流
InputStream is=conn.getInputStream();
//若正常打开Https,将获得一个有效值(即contentLength的值不为-1)。
int length=conn.getContentLength();
//……
//关闭流
is.close();
至此,我们就可以通过带有证书的HTTPS连接进行消息传递了。