2012-04-30 16 views
6

Chciałbym skonfigurować serwer proxy dla mojego klienta z Jersey.
Nie chcę skonfigurować serwera proxy dla całej aplikacji (używając argumentów JVM, takich jak http.proxyHost), i raczej nie używam klienta Apache.
Czytam here, że istnieje opcja, aby to zrobić, zapewniając HttpUrlConnection przez HttpUrlConnectionFactory, ale nie mogłem znaleźć żadnego przykładowego kodu.
Czy ktoś wie, jak mogę to zrobić?
Dzięki!Konfiguracja serwera proxy dla klienta Jersey

Odpowiedz

10

z pomocą Luca, mam to zrobić:

  1. Wdrożenie HttpURLConnectionFactory i zastąpić metodę 'getHttpURLConnection', moja implementacja jest (dzięki Luca):
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);

  2. Befo ponownie utworzyć klienta Jersey, utworzyć nowy URLConnectionClientHandler i podać swój HttpURLConnectionFactory w swoim konstruktorze. Następnie utwórz nowego klienta i podaj swój ClientHandler w konstruktorze klienta. Mój kod:
    URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory());
    _client = new Client(urlConnectionClientHandler);

nadzieję, że to pomaga.

+0

Należy zauważyć, że działa to tylko w Javie 6 - konstruktor HttpURLConnection z Proxy nie jest dostępny w Javie 5. –

2

Spróbuj

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

Nie jestem pewien jak, aktualnie używam 'Client.create (config)'. Nie można znaleźć żadnej opcji użycia 'UrlConnection' podczas tworzenia klienta. – danieln

5

Przede wszystkim stworzyłem tę klasę

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

} 

potem też utworzyć inną klasę o nazwie 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; 
    } 

} 

następnie po utworzeniu tej klasy Dzwonię na klienta jak ten

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

Zamień webProxy.getWeserviceHost na swój proxyHost i webProxy.getWebservi ceProxyPort() przez port proxy.

To zadziałało dla mnie i powinno działać również dla Ciebie. Zauważ, że używam oprogramowania Jersey 1.8, ale powinno również działać dla Jersey 2

+0

dzięki, to działało dla mnie. – whoami