HttpsURLConnection 安全传输(HTTPS--Secure Hypertext Transfer Protocol-安全超文本传输协议)

HttpsURLConnection 安全传输(HTTPS--Secure Hypertext Transfer Protocol-安全超文本传输协议)
HttpsURLConnection 扩展 HttpURLConnection,支持各种特定于 https 功能。此类使用 HostnameVerifier 和 SSLSocketFactory。为这两个类都定义了默认实现。但是,可以根据每个类(静态的)或每个实例来替换该实现。所有新 HttpsURLConnection 实例在创建时将被分配“默认的”静态值,通过在连接前调用每个实例适当的 set 方法可以重写这些值

在URL前加https://前缀表明是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。

Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的,...

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全
package  com.yixun.wap;

import  java.io. * ;
import  java.net. * ;
import  java.security. * ;
import  java.security.cert. * ;
import  javax.net.ssl. * ;

public   class  HttpsURLConnectionTest  {

    
private String url = "https://esales.the9.com/esa/DealerLogin.php?txt_sLogin=andysmile234&pas_sPwd=343211&userstatus=1";

    
private myX509TrustManager xtm = new myX509TrustManager();

    
private myHostnameVerifier hnv = new myHostnameVerifier();

    
public HttpsURLConnectionTest() {
        SSLContext sslContext 
= null;
        
try {
            sslContext 
= SSLContext.getInstance("TLS"); //或SSL
            X509TrustManager[] xtmArray = new X509TrustManager[] {xtm};
            sslContext.init(
null, xtmArray, new java.security.SecureRandom());
        }
 catch (GeneralSecurityException e) {
            e.printStackTrace();
        }

        
if (sslContext != null{
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        }

        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
    }


    
public void run() {
        HttpsURLConnection urlCon 
= null;
        
try {
            urlCon 
= (HttpsURLConnection)(new URL(url)).openConnection();
            urlCon.setDoOutput(
true);
            urlCon.setRequestMethod(
"POST");
            urlCon.setRequestProperty(
"Content-Length""1024");
            urlCon.setUseCaches(
false);
            urlCon.setDoInput(
true);
            urlCon.getOutputStream().write(
"request content".getBytes("gbk"));
            urlCon.getOutputStream().flush();
            urlCon.getOutputStream().close();
            BufferedReader in 
= new BufferedReader(new InputStreamReader(urlCon.getInputStream()));
            String line;
            
while ((line = in.readLine()) != null{
                System.out.println(line);
            }

            
// 增加自己的代码
        }
 catch (MalformedURLException e) {
            e.printStackTrace();
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    
public static void main(String[] args) {
        HttpsURLConnectionTest httpsTest 
= new HttpsURLConnectionTest();
        httpsTest.run();
    }

}


/** */ /**
 * 重写三个方法
 * 
@author Administrator
 *
 
*/

class  myX509TrustManager  implements  X509TrustManager  {
    
    
public void checkClientTrusted(X509Certificate[] chain, String authType) {
    }


    
public void checkServerTrusted(X509Certificate[] chain, String authType) {
        System.out.println(
"cert: " + chain[0].toString() + ", authType: " + authType);
    }


    
public X509Certificate[] getAcceptedIssuers() {
        
return null;
    }

}


/** */ /**
 * 重写一个方法
 * 
@author Administrator
 *
 
*/

class  myHostnameVerifier  implements  HostnameVerifier  {

    
public boolean verify(String hostname, SSLSession session) {
        System.out.println(
"Warning: URL Host: " + hostname + " vs. " + session.getPeerHost());
        
return true;
    }

}


以下摘自: http://www.zimbio.com/member/kinggod03/articles/HImNQwJm-Lp/ 
 终于完成了博客备份的程序,自己一直想做的事情算是完成了。发扬怀疑一切的精神,真不放心把自己的帐号告诉其他的公司,让他们来备份。闲来无事,也为了让我玩实况累的发软的手体验一下敲代码的感觉,专心的做完了这个备份博客的程序。总共有300多行,功能其实也很简单,就是把每篇文章的网页保存起来 ,但第一次做这种网络程序,很多都要学习。下面列出几点收获:
1,登陆需要使用SSL协议,似乎封装的太好了——只是把代码烤过来,很简单,现在也没懂是啥意思
2,使用Cookie。登录之后究竟用什么保存SessionID,头疼了很长时间。用IE进行登陆,把Cookie设成“提示”,于是所有的暗箱操作都见了阳光。这时才知道,几乎每个网页都会用Cookie存些东西,哪还有隐私。百度是必须用Cookie的,否则就无法登陆。这样有些过分了,应该提供一个选择。得到Cookie值后需要把“PASSPORTRETRYSTRING=deleted;”去掉,这个字段应该是用于防止重复提交的。如果不去掉,相当于没有登陆。去掉之后的Cookie值(主要是BDUUSS和BDUID)可以发送到服务器,这样就以登陆用户的身份查看博客了。
3,对于HTML代码应该可以用XML的方式来处理,不过我没有那个耐心,就用字符串的替代查找来实现了,效率不好,可以改进。
4,连接那部分代码借鉴了Google提供的博客访问的源代码,受益匪浅。百度没有相应的API,要不然我也不用这么麻烦。
5,还有许多细节的东西,比如文件读写啦。
6,看HTML代码真是头大!!!
为了取得信任我就把源代码贴出来,这也是我不愿意用那些商业软件的原因。商业软件,赚钱是最主要的,他不信任我,我也不信任他。而我,只不过图个安心和方便。
package  com.yixun.wap;

/** */ /**
 * 本程序可用于备份百度空间的文章。
 * 18 hours costed.
 * niuys. 
 * 2007.7.11
 
*/

import  java.io. * ;
import  java.net. * ;
import  java.security.GeneralSecurityException;
import  java.security.cert.X509Certificate;
import  java.util. * ;

import  javax.net.ssl.HostnameVerifier;
import  javax.net.ssl.HttpsURLConnection;
import  javax.net.ssl.SSLContext;
import  javax.net.ssl.SSLSession;
import  javax.net.ssl.X509TrustManager;

public   class  OpticalBackup  {
    
// 把博客信息应编码
    private String urlString = "https://passport.baidu.com/?login";

    
// 保存的目录
    private String saveDir = "L:\\blogBackup";

    
// 博客的根路径
    private String spaceRoot = "http://hi.baidu.com/niuys/blog/index/";

    
private String articleURLHead = "/niuys/blog/item/";

    
// parameters needed to log in.
    Map parameters = new HashMap();

    
// 建立连接需要使用cookie提供的sessionID.
    String cookieVal = null;

    
// Create an anonymous class to trust all certificates.
    
// This is bad style, you should create a separate class.
    private X509TrustManager xtm = new X509TrustManager() {
        
public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }


        
public void checkServerTrusted(X509Certificate[] chain, String authType) {
            
// System.out.println("cert: " + chain[0].toString() + ", authType:
            
// "
            
// + authType);
        }


        
public X509Certificate[] getAcceptedIssuers() {
            
return null;
        }

    }
;

    
// Create an class to trust all hosts
    private HostnameVerifier hnv = new HostnameVerifier() {
        
public boolean verify(String hostname, SSLSession session) {
            
// System.out.println("hostname: " + hostname);
            return true;
        }

    }
;

    
// In this function we configure our system with a less stringent
    
// hostname verifier and X509 trust manager. This code is
    
// executed once, and calls the static methods of HttpsURLConnection
    public OpticalBackup() {
        
// The parameters needed to log on.
        parameters.put("username""保密");
        parameters.put(
"password""保密");
        parameters.put(
"Submit"" 登录 ");
        parameters.put(
"tpl""sp");
        parameters.put(
"tpl_reg""sp");
        parameters.put(
"u""http://www.baidu.com/");

        
// check the saveDir
        File dir = new File(saveDir);
        
if (!dir.exists()) {
            dir.mkdir();
        }


        
// Initialize the TLS SSLContext with
        
// our TrustManager
        SSLContext sslContext = null;
        
try {
            sslContext 
= SSLContext.getInstance("TLS");
            X509TrustManager[] xtmArray 
= new X509TrustManager[] {xtm};
            sslContext.init(
null, xtmArray, new java.security.SecureRandom());
        }
 catch (GeneralSecurityException e) {
            
// Print out some error message and deal with this exception
            e.printStackTrace();
        }


        
// Set the default SocketFactory and HostnameVerifier
        
// for javax.net.ssl.HttpsURLConnection
        if (sslContext != null{
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        }

        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
    }


    
// the whole process
    public void run() {
        
try {
            URL url 
= new URL(urlString);
            HttpURLConnection urlConnection 
= (HttpURLConnection) url.openConnection();

            
// Set properties of the connection
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(
true);
            urlConnection.setUseCaches(
false);
            urlConnection.setRequestProperty(
"Content-Type""application/x-www-form-urlencoded");

            
// Form the POST parameters
            StringBuilder content = new StringBuilder();
            
boolean first = true;
            Set set 
= parameters.entrySet();
            Iterator iterator 
= set.iterator();
            Map.Entry parameter 
= (Map.Entry) iterator.next();
            
try {
                
while (parameter != null{
                    
if (!first) {
                        content.append(
"&");
                    }

                    content.append(URLEncoder.encode((String) parameter.getKey(), 
"UTF-8")).append("=");
                    content.append(URLEncoder.encode((String) parameter.getValue(), 
"UTF-8"));
                    first 
= false;
                    parameter 
= (Map.Entry) iterator.next();
                }

            }
 catch (NoSuchElementException e) {
                e.printStackTrace();
            }


            
// send the POST request to server
            OutputStream outputStream = null;
            
try {
                outputStream 
= urlConnection.getOutputStream();
                outputStream.write(content.toString().getBytes(
"utf-8"));
                outputStream.flush();
            }
 finally {
                
if (outputStream != null{
                    outputStream.close();
                }

            }


            
// Retrieve the output
            InputStream inputStream = null;
            StringBuilder outputBuilder 
= new StringBuilder();
            
try {
                
int responseCode = urlConnection.getResponseCode();
                
if (responseCode == HttpURLConnection.HTTP_OK) {
                    inputStream 
= urlConnection.getInputStream();
                }
 else {
                    inputStream 
= urlConnection.getErrorStream();
                }


                String string;
                
if (inputStream != null{
                    BufferedReader reader 
= new BufferedReader(new InputStreamReader(inputStream));
                    
while (null != (string = reader.readLine())) {
                        outputBuilder.append(string).append(
'\n');
                    }

                }


                
// get the cookie value in the header filelds
                Map map = urlConnection.getHeaderFields();
                Collection collection 
= map.values();
                Object[] values 
= collection.toArray();
                
// values[4].toString() is nedded .Otherwise,an exception
                
// throws. Direct class cast is forbidded.
                cookieVal = (String) values[4].toString();

                
// "replaceAll()" requests that if "[" exits, "]" is nedded
                
// too.This is the diffrence from "replace()".
                cookieVal = cookieVal.replace(']'' ').replace("[PASSPORTRETRYSTRING=deleted; expires=Mon, 01 Jan 1970 00:00:00 GMT; path=/;""");// remedy the first key from cookie
            }
 finally {
                
if (inputStream != null{
                    inputStream.close();
                }

            }


            
// find all the URLs of the articles you write.
            ArrayList pageURLs = findLinkers();

            
// save all the articles
            for (int i = 0; i < pageURLs.size(); i++{
                savePage((String) pageURLs.get(i));
            }

        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    
// save the article with the URL
    private void savePage(String pageURL) {
        
try {
            
// create the file to accept the output.The file's name is a part of
            
// the URL
            File pageFile = new File(saveDir + "\\" + pageURL.substring(36));

            
// 增量备份
            if (pageFile.exists())
                
return;
            FileWriter fw 
= new FileWriter(pageFile);

            
// create the connection to the server,and get the results.
            URL url = new URL(pageURL);
            String content 
= getContentFromURL(url);

            
// write the contents to the file.
            fw.write(content);
            
// flush the contents in the buffer.Without
            
// it,the file's content may be not completed.
            fw.flush();
            fw.close();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    
// find all the articles' URL from the html code accepted from the server
    private ArrayList findLinkers() {
        
// the index of the articles
        int i = 0;
        ArrayList linkers 
= new ArrayList();
        URL url 
= null;

        
try {
            
while (true{
                url 
= new URL(spaceRoot + i);
                System.out.println(
"url==" + url);
                i
++;// next index
                
// get the content from server
                String content = getContentFromURL(url);
                
// Analyze the content.
                ArrayList temp = getLinkerFromContent(content);
                
if (temp.isEmpty())// no article url exists
                    return linkers;

                linkers.addAll(temp);
// combine the URLs
            }

        }
 catch (Exception e) {
            e.printStackTrace();
        }


        
return linkers;
    }


    
private ArrayList getLinkerFromContent(String content) {
        ArrayList linkerArray 
= new ArrayList();
        String linker 
= null;
        
// The article's URL begins with "/niuys/blog/item/"
        int index = content.indexOf(articleURLHead);
        
if (content.indexOf("暂无文章"> 0{// 超过页数时会返回包含“暂无文章”的页,end
            return linkerArray;
        }


        
// deal with the content
        while (index > 0{
            
// get the whole URL
            linker = content.substring(index, index + 46);
            content 
= content.replace(linker, "");
            index 
= content.indexOf(articleURLHead);
            linker 
= "http://hi.baidu.com" + linker;
            linkerArray.add(linker);

            System.out.println(
"linker==" + linker);
        }


        
return linkerArray;
    }


    
private String getContentFromURL(URL url) throws Exception {
        HttpURLConnection urlConnection 
= (HttpURLConnection) url.openConnection();

        
// Set properties of the connection
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(
true);
        urlConnection.setUseCaches(
false);
        urlConnection.setRequestProperty(
"Content-Type""application/x-www-form-urlencoded");
        urlConnection.addRequestProperty(
"Cookie", cookieVal);

        
// Retrieve the output
        InputStream inputStream = null;
        StringBuilder outputBuilder 
= new StringBuilder();

        
int responseCode = urlConnection.getResponseCode();
        
if (responseCode == HttpURLConnection.HTTP_OK) {
            inputStream 
= urlConnection.getInputStream();
        }
 else {
            inputStream 
= urlConnection.getErrorStream();
        }


        String string;
        
if (inputStream != null{
            BufferedReader reader 
= new BufferedReader(new InputStreamReader(inputStream));
            
while (null != (string = reader.readLine())) {
                outputBuilder.append(string).append(
'\n');
            }

            inputStream.close();
            
return outputBuilder.toString();
        }

        
return "";
    }


    
public static void main(String[] args) {
        OpticalBackup backup 
= new OpticalBackup();
        backup.run();
    }


}





http://www.blogjava.net/jzone/articles/307329.html

你可能感兴趣的:(HttpsURLConnection 安全传输(HTTPS--Secure Hypertext Transfer Protocol-安全超文本传输协议))