httpclient跳過https請求的驗證

來源:互聯網
上載者:User

標籤:跳過   style   url   throws   擷取   請求方式   protoc   bsp   pos   

一、因為在使用https發送請求的時候會涉及,驗證方式。但是這種方式在使用的時候很不方便。特別是在請求外部介面的時候,所以這我寫了一個跳過驗證的方式。(供參考)

二、加入包,這裡用的是commons-httpclient 3.1 的包。一般請求採用最新的httpclient4.5就可以了

<dependency>  <groupId>commons-httpclient</groupId>  <artifactId>commons-httpclient</artifactId>  <version>3.1</version></dependency>

三、這裡我們實現3個類

1、MyX509TrustManager(這個方法直接實現X509TrustManager,X509TrustManager在javax.net.ssl.X509TrustManager裡面)

這裡直接實現不用改任何東西

import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;public class MyX509TrustManager implements X509TrustManager {    /* (non-Javadoc)    * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String)    */    public void checkClientTrusted(X509Certificate[] arg0, String arg1)            throws CertificateException {    }    /* (non-Javadoc)     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String)     */    public void checkServerTrusted(X509Certificate[] arg0, String arg1)            throws CertificateException {    }    /* (non-Javadoc)     * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()     */    public X509Certificate[] getAcceptedIssuers() {        return null;    }}

2、MySecureProtocolSocketFactory(這裡我們需要用到SSLContext,還需要改寫一個實現SecureProtocolSocketFactory的方法)

import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import org.apache.commons.httpclient.ConnectTimeoutException;import org.apache.commons.httpclient.HttpClientError;import org.apache.commons.httpclient.params.HttpConnectionParams;import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory;import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {    //這裡添加一個屬性,主要目的就是來擷取ssl跳過驗證    private SSLContext sslContext = null;    /**     * Constructor for MySecureProtocolSocketFactory.     */    public MySecureProtocolSocketFactory() {    }    /**     * 這個建立一個擷取SSLContext的方法,匯入MyX509TrustManager進行初始化     * @return     */    private static SSLContext createEasySSLContext() {        try {            SSLContext context = SSLContext.getInstance("SSL");            context.init(null, new TrustManager[] { new MyX509TrustManager() },                    null);            return context;        } catch (Exception e) {            throw new HttpClientError(e.toString());        }    }    /**     * 判斷擷取SSLContext     * @return     */    private SSLContext getSSLContext() {        if (this.sslContext == null) {            this.sslContext = createEasySSLContext();        }        return this.sslContext;    }    //後面的方法基本上就是帶入相關參數就可以了    /*     * (non-Javadoc)     *     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,     *      int, java.net.InetAddress, int)     */    public Socket createSocket(String host, int port, InetAddress clientHost,int clientPort) throws IOException, UnknownHostException {        return getSSLContext().getSocketFactory().createSocket(host, port,clientHost, clientPort);    }    /*     * (non-Javadoc)     *     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,     *      int, java.net.InetAddress, int,     *      org.apache.commons.httpclient.params.HttpConnectionParams)     */    public Socket createSocket(final String host, final int port,final InetAddress localAddress, final int localPort,                               final HttpConnectionParams params) throws IOException,UnknownHostException, ConnectTimeoutException {        if (params == null) {            throw new IllegalArgumentException("Parameters may not be null");        }        int timeout = params.getConnectionTimeout();        if (timeout == 0) {            return createSocket(host, port, localAddress, localPort);        } else {            return ControllerThreadSocketFactory.createSocket(this, host, port,localAddress, localPort, timeout);        }    }    /*     * (non-Javadoc)     *     * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)     */    public Socket createSocket(String host, int port) throws IOException,UnknownHostException {        return getSSLContext().getSocketFactory().createSocket(host, port);    }    /*     * (non-Javadoc)     *     * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)     */    public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {        return getSSLContext().getSocketFactory().createSocket(socket, host,port, autoClose);    }}

3、然後就是httpclient了,這裡實現的方式很單間了,只要聲明MySecureProtocolSocketFactory加入就可以了Protocol

import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.protocol.Protocol;import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;/* * 利用HttpClient進行post請求的工具類 */public class HttpClientUtil {    public static String doGet(String url) throws Exception {        //聲明        ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();        //加入相關的https請求方式        Protocol.registerProtocol("https", new Protocol("https", fcty, 443));        //發送請求即可        org.apache.commons.httpclient.HttpClient httpclient = new org.apache.commons.httpclient.HttpClient();        GetMethod httpget = new GetMethod(url);        System.out.println("======url:" + url);        try {            httpclient.executeMethod(httpget);            return httpget.getResponseBodyAsString();        } catch (Exception ex) {            ex.printStackTrace();            throw new Exception(ex.getMessage());        } finally {            httpget.releaseConnection();        }    }}

四、這裡基本上就完成了,在會用的時候只要聲明MySecureProtocolSocketFactory加入就可以了Protocol,然後就可以實現驗證的跳過過了

 

httpclient跳過https請求的驗證

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.