Configure proxy to Jersey client

前端 未结 3 1171
悲哀的现实
悲哀的现实 2020-12-14 04:46

I would like to configure a proxy server to my Jersey client.
I don\'t want to configure the proxy to the whole application (using JVM arguments such as http.proxyHost),

相关标签:
3条回答
  • 2020-12-14 05:24

    With the help of Luca, I got it done:

    1. Implement HttpURLConnectionFactory, and override the method getHttpURLConnection, my implementation is (thanks to Luca):

      Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
      return new HttpURLConnection(url, proxy);
      
    2. Before instantiating the Jersey Client, create a new URLConnectionClientHandler, and provide your HttpURLConnectionFactory in its constructor. Then create a new Client, and provide your ClientHandler in the Client constructor. My code:

      URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory());
      _client = new Client(urlConnectionClientHandler);
      

    Hope that's help.

    0 讨论(0)
  • 2020-12-14 05:32

    Try

    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
    conn = new URL(url).openConnection(proxy);
    
    0 讨论(0)
  • 2020-12-14 05:34

    First of all I created this class

        import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory;
        import java.io.IOException;
        import java.net.HttpURLConnection;
        import java.net.InetSocketAddress;
        import java.net.Proxy;
        import java.net.URL;
        import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    
    /**
     *
     * @author Aimable
     */
    public class ConnectionFactory implements HttpURLConnectionFactory {
    
        Proxy proxy;
    
        String proxyHost;
    
        Integer proxyPort;
    
        SSLContext sslContext;
    
        public ConnectionFactory() {
        }
    
        public ConnectionFactory(String proxyHost, Integer proxyPort) {
            this.proxyHost = proxyHost;
            this.proxyPort = proxyPort;
        }
    
        private void initializeProxy() {
            proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
        }
    
        @Override
        public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
            initializeProxy();
            HttpURLConnection con = (HttpURLConnection) url.openConnection(proxy);
            if (con instanceof HttpsURLConnection) {
                System.out.println("The valus is....");
                HttpsURLConnection httpsCon = (HttpsURLConnection) url.openConnection(proxy);
                httpsCon.setHostnameVerifier(getHostnameVerifier());
                httpsCon.setSSLSocketFactory(getSslContext().getSocketFactory());
                return httpsCon;
            } else {
                return con;
            }
    
        }
    
        public SSLContext getSslContext() {
            try {
                sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, new TrustManager[]{new SecureTrustManager()}, new SecureRandom());
            } catch (NoSuchAlgorithmException ex) {
                Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
            } catch (KeyManagementException ex) {
                Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
            }
            return sslContext;
        }
    
        private HostnameVerifier getHostnameVerifier() {
            return new HostnameVerifier() {
                @Override
                public boolean verify(String hostname,
                        javax.net.ssl.SSLSession sslSession) {
                    return true;
                }
            };
        }
    
    }
    

    then I also create another class called SecureTrustManager

        import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.X509TrustManager;
    
    /**
     *
     * @author Aimable
     */
    public class SecureTrustManager implements X509TrustManager {
    
        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }
    
        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    
        public boolean isClientTrusted(X509Certificate[] arg0) {
            return true;
        }
    
        public boolean isServerTrusted(X509Certificate[] arg0) {
            return true;
        }
    
    }
    

    then after creation this class i'm calling the client like this

    URLConnectionClientHandler cc = new URLConnectionClientHandler(new ConnectionFactory(webProxy.getWebserviceProxyHost(), webProxy.getWebserviceProxyPort()));
        client = new Client(cc);
        client.setConnectTimeout(2000000);
    

    replace webProxy.getWeserviceHost by your proxyHost and webProxy.getWebserviceProxyPort() by the proxy port.

    This worked for me and it should work also for you. Note that i'm using Jersey 1.8 but it should also work for Jersey 2

    0 讨论(0)
提交回复
热议问题