2012-04-30 38 views
6

Tôi muốn định cấu hình máy chủ proxy cho ứng dụng khách Jersey của mình.
Tôi không muốn định cấu hình proxy cho toàn bộ ứng dụng (sử dụng đối số JVM như http.proxyHost) và Id'e không sử dụng máy khách Apache.
Tôi đọc here rằng có một tùy chọn để làm điều đó bằng cách cung cấp HttpUrlConnection qua HttpUrlConnectionFactory, nhưng tôi không thể tìm thấy bất kỳ ví dụ mã nào.
Có ai biết làm thế nào tôi có thể làm điều đó?
Cảm ơn!Định cấu hình proxy cho máy khách Jersey

Trả lời

10

Với sự giúp đỡ của Luca, tôi đã nhận nó làm:

  1. Thực hiện HttpURLConnectionFactory, và ghi đè lên các phương pháp 'getHttpURLConnection', thực hiện của tôi là (nhờ Luca):
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);

  2. befo tái tạo lại ứng dụng khách Jersey, tạo một URLConnectionClientHandler mới và cung cấp HttpURLConnectionFactory trong hàm tạo của nó. Sau đó, tạo một Máy khách mới và cung cấp cho ClientHandler của bạn trong trình tạo ứng dụng khách. Mã của tôi:
    URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory());
    _client = new Client(urlConnectionClientHandler);

Hy vọng rằng nhân giúp đỡ.

+0

Lưu ý rằng điều này chỉ hoạt động với Java 6 trở đi - hàm tạo HttpURLConnection có Proxy không sẵn dùng trong Java 5. –

2

Hãy thử

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

Tôi không chắc chắn cách thức, hiện tại tôi đang sử dụng 'Client.create (config)'. Không thể tìm thấy bất kỳ tùy chọn nào để sử dụng 'UrlConnection' khi tạo ứng dụng khách. – danieln

5

Trước hết tôi tạo ra lớp này

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

} 

sau đó tôi cũng tạo ra một lớp được gọi là 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; 
    } 

} 

sau đó sau khi tạo lớp này tôi đang kêu gọi các khách hàng như thế này

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

thay thế webProxy.getWeserviceHost bằng proxyHost và webProxy.getWebservi của bạn ceProxyPort() bằng cổng proxy.

Điều này phù hợp với tôi và nó cũng phù hợp với bạn. Lưu ý rằng tôi đang sử dụng Jersey 1.8 nhưng cũng nên hoạt động cho Jersey 2

+0

cảm ơn, điều này đã làm việc cho tôi. – whoami

Các vấn đề liên quan