Java https請求 HttpsURLConnection

來源:互聯網
上載者:User

有關tomcat 6.0如何配置https服務的文章可以參考:http://blog.csdn.net/zhou_zion/article/details/6759171

以下主要講解如何使用https發起post請求:

參考文檔:梁棟前輩的《Java加密與解密的藝術》

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.security.GeneralSecurityException;import java.security.KeyStore;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManagerFactory;public class HttpsPost {    /**     * 獲得KeyStore.     * @param keyStorePath     *            密鑰庫路徑     * @param password     *            密碼     * @return 密鑰庫     * @throws Exception     */    public static KeyStore getKeyStore(String password, String keyStorePath)            throws Exception {        // 執行個體化密鑰庫        KeyStore ks = KeyStore.getInstance("JKS");        // 獲得密鑰庫檔案流        FileInputStream is = new FileInputStream(keyStorePath);        // 載入密鑰庫        ks.load(is, password.toCharArray());        // 關閉密鑰庫檔案流        is.close();        return ks;    }    /**     * 獲得SSLSocketFactory.     * @param password     *            密碼     * @param keyStorePath     *            密鑰庫路徑     * @param trustStorePath     *            信任庫路徑     * @return SSLSocketFactory     * @throws Exception     */    public static SSLContext getSSLContext(String password,            String keyStorePath, String trustStorePath) throws Exception {        // 執行個體化密鑰庫        KeyManagerFactory keyManagerFactory = KeyManagerFactory                .getInstance(KeyManagerFactory.getDefaultAlgorithm());        // 獲得密鑰庫        KeyStore keyStore = getKeyStore(password, keyStorePath);        // 初始化密鑰工廠        keyManagerFactory.init(keyStore, password.toCharArray());        // 執行個體化信任庫        TrustManagerFactory trustManagerFactory = TrustManagerFactory                .getInstance(TrustManagerFactory.getDefaultAlgorithm());        // 獲得信任庫        KeyStore trustStore = getKeyStore(password, trustStorePath);        // 初始化信任庫        trustManagerFactory.init(trustStore);        // 執行個體化SSL上下文        SSLContext ctx = SSLContext.getInstance("TLS");        // 初始化SSL上下文        ctx.init(keyManagerFactory.getKeyManagers(),                trustManagerFactory.getTrustManagers(), null);        // 獲得SSLSocketFactory        return ctx;    }    /**     * 初始化HttpsURLConnection.     * @param password     *            密碼     * @param keyStorePath     *            密鑰庫路徑     * @param trustStorePath     *            信任庫路徑     * @throws Exception     */    public static void initHttpsURLConnection(String password,            String keyStorePath, String trustStorePath) throws Exception {        // 聲明SSL上下文        SSLContext sslContext = null;        // 執行個體化主機名稱驗證介面        HostnameVerifier hnv = new MyHostnameVerifier();        try {            sslContext = getSSLContext(password, keyStorePath, trustStorePath);        } catch (GeneralSecurityException e) {            e.printStackTrace();        }        if (sslContext != null) {            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext                    .getSocketFactory());        }        HttpsURLConnection.setDefaultHostnameVerifier(hnv);    }    /**     * 發送請求.     * @param httpsUrl     *            請求的地址     * @param xmlStr     *            請求的資料     */    public static void post(String httpsUrl, String xmlStr) {        HttpsURLConnection urlCon = null;        try {            urlCon = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();            urlCon.setDoInput(true);            urlCon.setDoOutput(true);            urlCon.setRequestMethod("POST");            urlCon.setRequestProperty("Content-Length",                    String.valueOf(xmlStr.getBytes().length));            urlCon.setUseCaches(false);            //設定為gbk可以解決伺服器接收時讀取的資料中文亂碼問題            urlCon.getOutputStream().write(xmlStr.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();        }    }    /**     * 測試方法.     * @param args     * @throws Exception     */    public static void main(String[] args) throws Exception {        // 密碼        String password = "123456";        // 密鑰庫        String keyStorePath = "tomcat.keystore";        // 信任庫        String trustStorePath = "tomcat.keystore";        // 本地起的https服務        String httpsUrl = "https://localhost:8443/service/httpsPost";        // 傳輸文本        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><fruitShop><fruits><fruit><kind>蘿蔔</kind></fruit><fruit><kind>菠蘿</kind></fruit></fruits></fruitShop>";        HttpsPost.initHttpsURLConnection(password, keyStorePath, trustStorePath);        // 發起請求        HttpsPost.post(httpsUrl, xmlStr);    }}

import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLSession;/** * 實現用於主機名稱驗證的基底介面。  * 在握手期間,如果 URL 的主機名稱和伺服器的標識主機名稱不匹配,則驗證機制可以回調此介面的實現程式來確定是否應該允許此串連。 */public class MyHostnameVerifier implements HostnameVerifier {@Overridepublic boolean verify(String hostname, SSLSession session) {if("localhost".equals(hostname)){return true;} else {return false;}}}

接收請求的Web應用:

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <servlet>    <servlet-name>rollBack</servlet-name>    <servlet-class>rollBack</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>rollBack</servlet-name>    <url-pattern>/httpsPost</url-pattern>  </servlet-mapping>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

rollBack servlet

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class rollBack extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//擷取請求流ServletInputStream sis = request.getInputStream();BufferedReader in = new BufferedReader(new InputStreamReader(sis));String line;if((line = in.readLine()) != null){System.out.println(line);}in.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.