Java 如何在Apache HttpComponents中使用自定义socketfactory

Java 如何在Apache HttpComponents中使用自定义socketfactory,java,apache-httpclient-4.x,apache-httpcomponents,socketfactory,Java,Apache Httpclient 4.x,Apache Httpcomponents,Socketfactory,我一直在尝试在ApacheHttpComponents项目的httpclient库中使用自定义SocketFactory。到目前为止没有运气。我原以为我可以为HttpClient实例设置一个套接字工厂,但这显然不是那么容易 at的HttpComponents文档确实提到了套接字工厂,但没有说明如何使用它们 有人知道这是怎么做到的吗?我们使用自定义套接字工厂允许HttpClient连接使用不受信任的证书连接到HTTPS URL 我们是如何做到这一点的: 我们从Oleg引用的示例源目录中修改了“Ea

我一直在尝试在ApacheHttpComponents项目的httpclient库中使用自定义SocketFactory。到目前为止没有运气。我原以为我可以为HttpClient实例设置一个套接字工厂,但这显然不是那么容易

at的HttpComponents文档确实提到了套接字工厂,但没有说明如何使用它们


有人知道这是怎么做到的吗?

我们使用自定义套接字工厂允许HttpClient连接使用不受信任的证书连接到HTTPS URL

我们是如何做到这一点的:

  • 我们从Oleg引用的示例源目录中修改了“EasySSLProtocolSocketFactory”和“EasyX509TrustManager”类的实现

  • 在我们的HttpClient启动代码中,我们执行以下操作以启用新的套接字工厂:

    HttpClient httpClient = new HttpClient();
    Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
    Protocol.registerProtocol("https", easyhttps);
    
        CustomSocketFactory socketFactory = new CustomSocketFactory();
        Scheme scheme = new Scheme("http", 80, socketFactory);
        httpclient.getConnectionManager().getSchemeRegistry().register(scheme);
    

  • 因此,每当我们请求https://URL时,都会使用这个套接字工厂。

    oleg的回答当然是正确的,我只是想把信息直接放在这里,以防链接出错。在创建HttpClient的代码中,我使用此代码让它使用我的套接字工厂:

    HttpClient httpClient = new HttpClient();
    Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
    Protocol.registerProtocol("https", easyhttps);
    
        CustomSocketFactory socketFactory = new CustomSocketFactory();
        Scheme scheme = new Scheme("http", 80, socketFactory);
        httpclient.getConnectionManager().getSchemeRegistry().register(scheme);
    
    CustomSocketFactory
    是我自己的套接字工厂,我想将其用于正常的HTTP通信,这就是为什么我使用
    “HTTP”
    80
    作为参数

    我的CustomSchemeCheckFactory与此类似:

    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;
      }
    
    }
    

    如果我没有弄错的话,EasySSLProtocolSocketFactory是一个HttpClient 3类。它在较新的HttpComponents客户端v4中不可用。请参阅Apache HttpClient示例中的“自定义SSL上下文”