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连接进行消息传递了。