4

我一直在嘗試從Apache HTTPComponents項目的httpclient庫中使用自定義的SocketFactory。到目前爲止沒有運氣。我期待着我可以爲HttpClient實例設置一個套接字工廠,但顯然不是那麼容易。如何在Apache HttpComponents中使用自定義的socketfactory

HttpComponents的文檔http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html確實提到套接字工廠,但沒有說明如何使用它們。

有人知道這是怎麼完成的嗎?

+1

見 '自定義SSL上下文' Apache的HttpClient的例子http://hc.apache.org/httpcomponents-client-ga/examples.html – oleg

回答

2

我們使用自定義套接字工廠來允許HttpClient連接連接到帶有不可信證書的HTTPS URL。

下面是我們如何做到了:

  1. 我們適應兩者實現了「EasySSLProtocolSocketFactory」和由奧列格引用的例子源目錄「EasyX509TrustManager」類。

  2. 在我們HttpClient的啓動代碼,我們就以下啓用新的套接字工廠:

    HttpClient httpClient = new HttpClient(); 
    Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443); 
    Protocol.registerProtocol("https", easyhttps); 
    

所以,任何時候,我們請求https://開頭的URL,這個套接字工廠使用。

+7

如果我m沒錯,EasySSLProtocolSocketFactory是一個HttpClient 3類。它在新的HttpComponents客戶端v4中不可用。 – FabienB

2

oleg的答案當然是正確的,我只是想直接在這裏提供信息,以防萬一鏈接不好。在創建一個HttpClient的代碼,我用這個代碼,讓它使用我的插座廠:

CustomSocketFactory socketFactory = new CustomSocketFactory(); 
    Scheme scheme = new Scheme("http", 80, socketFactory); 
    httpclient.getConnectionManager().getSchemeRegistry().register(scheme); 

CustomSocketFactory是我自己的套接字工廠,我想用它進行正常的HTTP流量,這就是爲什麼我用"http"80作爲參數。

我CustomSchemeSocketFactory類似於此:

public class CustomSchemeSocketFactory implements SchemeSocketFactory { 

    @Override 
    public Socket connectSocket(Socket socket, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpParams params) throws IOException, UnknownHostException, ConnectTimeoutException { 

    if (localAddress != null) { 
     socket.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params)); 
     socket.bind(localAddress); 
    } 
    int connTimeout = HttpConnectionParams.getConnectionTimeout(params); 
    int soTimeout = HttpConnectionParams.getSoTimeout(params); 

    try { 
     socket.setSoTimeout(soTimeout); 
     socket.connect(remoteAddress, connTimeout); 
    } catch (SocketTimeoutException ex) { 
     throw new ConnectTimeoutException("Connect to " + remoteAddress + " timed out"); 
    } 

    return socket; 
    } 

    @Override 
    public Socket createSocket(HttpParams params) throws IOException { 
    // create my own socket and return it 
    } 

    @Override 
    public boolean isSecure(Socket socket) throws IllegalArgumentException { 
    return false; 
    } 

} 
相關問題