2012-04-30 29 views
6

Me gustaría configurar un servidor proxy para mi cliente de Jersey.
No quiero configurar el proxy para toda la aplicación (usando argumentos de JVM como http.proxyHost), y prefiero no utilizar el cliente de Apache.
He leído here que hay una opción para hacerlo proporcionando HttpUrlConnection a través de HttpUrlConnectionFactory, pero no he podido encontrar ningún ejemplo de código.
¿Alguien sabe cómo puedo hacerlo?
Gracias!Configurar proxy para el cliente de Jersey

Respuesta

10

Con la ayuda de Luca, yo tengo hecho:

  1. Implementar HttpURLConnectionFactory, y reemplazar el método 'getHttpURLConnection', mi aplicación es (gracias a Luca):
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);

  2. Ante s Al instanciar el Jersey Client, cree un nuevo URLConnectionClientHandler y proporcione su HttpURLConnectionFactory en su constructor. Luego, cree un nuevo Cliente y proporcione su ClientHandler en el constructor del Cliente. Mi código:
    URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory());
    _client = new Client(urlConnectionClientHandler);

la esperanza de que la ayuda.

+0

Tenga en cuenta que esto solo funciona con Java 6 en adelante - el constructor HttpURLConnection con Proxy no está disponible en Java 5. –

2

Trate

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

No estoy seguro de cómo, actualmente estoy usando 'Client.create (config)'. No se pudo encontrar ninguna opción para usar 'UrlConnection' al crear el cliente. – danieln

5

Primero de todo lo creado esta clase

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

} 

entonces yo también crear otra clase llamada 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; 
    } 

} 

continuación, después de la creación de esta clase Voy a llamar al cliente como éste

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

reemplace webProxy.getWeserviceHost por su proxyHost y webProxy.getWebservi ceProxyPort() por el puerto proxy.

Esto funcionó para mí y debería funcionar también para usted. Tenga en cuenta que estoy usando Jersey 1.8, pero también debería funcionar para Jersey 2

+0

gracias, esto funcionó para mí. – whoami

Cuestiones relacionadas