Setting up a proxy server for a client in Jersey

I would like to set up a proxy server for my client in Jersey. I do not want to configure proxies for the entire application (using JVM arguments such as http.proxyHost), and Id'e most likely does not use the Apache client.
I read here that it is possible to do this by providing an HttpUrlConnection via an HttpUrlConnectionFactory, but I could not find the code. Does anyone know how I can do this?
Thanks!

+6
source share
3 answers

Using Luca, I did this:

  • Deploy HttpURLConnectionFactory and override getHttpURLConnection method, my implementation (thanks Luca):
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);

  • Before creating the jersey client, create a new URLConnectionClientHandler and provide an HttpURLConnectionFactory in your constructor. Then create a new client and provide the ClientHandler in the Client constructor. My code is:
    URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory());
    _client = new Client(urlConnectionClientHandler);

Hope this helps.

+10
source

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 creating this class I call the client as follows

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

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

It worked for me, and it should work for you too. Please note that I am using Jersey 1.8, but it should also work on Jersey 2

+5
source

Try

 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); conn = new URL(url).openConnection(proxy); 
+2
source

Source: https://habr.com/ru/post/914547/


All Articles