2012-05-02 28 views
12

हाय मेरे पास एक जर्सी क्लाइंट है जिसका उपयोग मैं एक फ़ाइल अपलोड करने के लिए करता हूं। मैंने इसे स्थानीय रूप से उपयोग करने की कोशिश की और सब कुछ ठीक काम करता है। लेकिन उत्पादन वातावरण में मुझे प्रॉक्सी सेट करना होगा। मैंने कुछ पृष्ठों के माध्यम से ब्राउज़ किया लेकिन सटीक समाधान नहीं मिला। क्या कोई इस से मेरी मदद कर सकता है?जर्सी क्लाइंट + सेट प्रॉक्सी

यहाँ मेरे मुवक्किल कोड है:

File file = new File("e:\\test.zip"); 
FormDataMultiPart part = new FormDataMultiPart(); 

    part.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); 

    WebResource resource = null; 

    if(proxy.equals("yes")){ 
    //How do i configure client in this case? 

    }else{ 
      //this uses system proxy i guess 
     resource = Client.create().resource(url); 
    } 

    String response = (String)resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part); 

    System.out.println(response); 

उत्तर

2

ये रहा:

DefaultApacheHttpClient4Config config = new DefaultApacheHttpClient4Config(); 
     config.getProperties().put(
     ApacheHttpClient4Config.PROPERTY_PROXY_URI, 
     "PROXY_URL" 
); 

config.getProperties().put(
     ApacheHttpClient4Config.PROPERTY_PROXY_USERNAME, 
     "PROXY_USER" 
); 

config.getProperties().put(
     ApacheHttpClient4Config.PROPERTY_PROXY_PASSWORD, 
     "PROXY_PASS" 
);  

Client c = ApacheHttpClient4.create(config); 
WebResource r = c.resource("https://www.google.com/"); 
12

वहाँ एक आसान तरीका है अगर आप विरासत परियोजनाओं में अधिक पुस्तकालयों से बचना चाहते हैं और के लिए कोई जरूरत नहीं है प्रॉक्सी प्रमाणीकरण:

:

सबसे पहले आप एक वर्ग जो HttpURLConnectionFactory लागू करता है की जरूरत है

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.InetSocketAddress; 
import java.net.Proxy; 
import java.net.URL; 

import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory; 


public class ConnectionFactory implements HttpURLConnectionFactory { 

    Proxy proxy; 

    private void initializeProxy() { 
     proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxy.com", 3128)); 
    } 

    public HttpURLConnection getHttpURLConnection(URL url) throws IOException { 
     initializeProxy(); 
     return (HttpURLConnection) url.openConnection(proxy); 
    } 
} 

दूसरा एक com.sun.jersey.client.urlconnection.URLConnectionHandler

URLConnectionClientHandler ch = new URLConnectionClientHandler(new ConnectionFactory()); 

का दृष्टांत है और तीसरे Client.create के बजाय Client निर्माता का उपयोग करने के लिए है:

Client client = new Client(ch); 
बेशक

आप ConnectionFactory में प्रॉक्सी का प्रारंभ करने अनुकूलित कर सकते हैं ।

+1

यह मेरे लिए काम करता है .......... –

9

luckyluke उत्तर काम करेगा। यहाँ मेरी संस्करण:

ClientConfig config = new DefaultClientConfig(); 
Client client = new Client(new URLConnectionClientHandler(
     new HttpURLConnectionFactory() { 
    Proxy p = null; 
    @Override 
    public HttpURLConnection getHttpURLConnection(URL url) 
      throws IOException { 
     if (p == null) { 
      if (System.getProperties().containsKey("http.proxyHost")) { 
       p = new Proxy(Proxy.Type.HTTP, 
         new InetSocketAddress(
         System.getProperty("http.proxyHost"), 
         Integer.getInteger("http.proxyPort", 80))); 
      } else { 
       p = Proxy.NO_PROXY; 
      } 
     } 
     return (HttpURLConnection) url.openConnection(p); 
    } 
}), config); 
0

मैं user67871 लिया और यह थोड़ा बदल दिया है। इस दृष्टिकोण के बारे में अच्छा क्या है कि यह विंडोज़ पर सिस्टम प्रॉक्सी के साथ काम करता है। यदि आप विंडोज़ पर हैं और आप IE में प्रॉक्सी कॉन्फ़िगर करते हैं तो यह कोड इसे उठाएगा। जब आप फिडलर चला रहे हैं तो यह सिस्टम प्रॉक्सी भी सेट करता है, इसलिए यह जर्सी और फिडलर का एक साथ उपयोग करना वास्तव में आसान बनाता है।

Client client = new Client(new URLConnectionClientHandler(
      new HttpURLConnectionFactory() { 
     Proxy p = null; 

     @Override 
     public HttpURLConnection getHttpURLConnection(URL url) 
       throws IOException { 
      try { 
       if (p == null) { 
        List<Proxy> proxies = ProxySelector.getDefault().select(url.toURI()); 
        if (proxies != null) { 
         // just use the first one, I don't know if we should sometimes use a different one 
         p = proxies.get(0); 
        } 
        if (p == null) { 
         p = Proxy.NO_PROXY; 
        } 
       } 
       return (HttpURLConnection) url.openConnection(p); 
      } catch (URISyntaxException ex) { 
       throw new IOException(ex); 
      } 
     } 
    }), config); 
0

सबसे पहले मैं इस वर्ग

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

} 

तो मैं भी अन्य वर्ग 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; 
    } 

} 

बनाएं जिसका नाम बनाया तो निर्माण इस वर्ग मैं इस

तरह ग्राहक फोन कर रहा हूँ के बाद
URLConnectionClientHandler cc = new URLConnectionClientHandler(new ConnectionFactory(webProxy.getWebserviceProxyHost(), webProxy.getWebserviceProxyPort())); 
    client = new Client(cc); 
    client.setConnectTimeout(2000000); 

प्रॉक्सी पोर्ट द्वारा अपने proxyHost और webProxy.getWebserviceProxyPort() द्वारा webProxy.getWeserviceHost को बदलें।

यह मेरे लिए काम करता है और यह आपके लिए भी काम करना चाहिए। ध्यान दें कि मैं जर्सी 1.8 का उपयोग कर रहा हूँ लेकिन यह भी जर्सी 2

2
System.setProperty("http.proxyHost","your proxy url"); 
System.setProperty("http.proxyPort", "your proxy port"); 
0

SDolgy के लिए काम करना चाहिए। मैंने ऐसा किया जो जर्सी क्लाइंट इंस्टेंटेशन में 3 फीचर्स जोड़ता है: एसएसएल टीएलएसवी 1.1 (जेवीएम> = 1.7 आवश्यक) सक्षम करता है, कॉन्एक्स कॉन्फ़िगर करें। पूलिंग। संवहन बढ़ाने के लिए, एक सिस्टम प्रॉक्सी सेट करें।

# My props file  
# CONFIGURAR EL CLIENTE 
#PROXY_URI=http://5.5.5.5:8080 
#SECURITY_PROTOCOL=TLSv1.2 
#POOLING_HTTP_CLIENT_CONNECTION_MANAGER.MAXTOTAL=200 
#POOLING_HTTP_CLIENT_CONNECTION_MANAGER.DEFAULTMAXPERROUTE=20 

import java.util.Properties; 
import javax.net.ssl.SSLContext; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 

import org.apache.http.config.Registry; 
import org.apache.http.config.RegistryBuilder; 
import org.apache.http.conn.socket.ConnectionSocketFactory; 
import org.apache.http.conn.socket.PlainConnectionSocketFactory; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 

import org.glassfish.jersey.SslConfigurator; 
import org.glassfish.jersey.apache.connector.ApacheClientProperties; 
import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; 
import org.glassfish.jersey.client.ClientConfig; 
import org.glassfish.jersey.client.ClientProperties; 
import org.glassfish.jersey.jackson.JacksonFeature; 

public class JerseyClientHelper { 
    private static Client cliente; 
    private static final Properties configuracion = SForceConfiguration.getInstance(); 

    public static synchronized Client getInstance() { 
     if (cliente == null) {    
      SSLContext sslContext = SslConfigurator.newInstance().securityProtocol(configuracion.getProperty("SECURITY_PROTOCOL")).createSSLContext(); // Usar TLSv1.2 

      SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext); 
      Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() 
      .register("http", PlainConnectionSocketFactory.getSocketFactory()) 
      .register("https", socketFactory) 
      .build(); 

      // Para configurar las conexiones simultaneas al servidor 
      int maxTotal = Integer.parseInt(configuracion.getProperty("POOLING_HTTP_CLIENT_CONNECTION_MANAGER.MAXTOTAL")); 
      int defaultMaxPerRoute = Integer.parseInt(configuracion.getProperty("POOLING_HTTP_CLIENT_CONNECTION_MANAGER.DEFAULTMAXPERROUTE")); 
      PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); 
      connectionManager.setMaxTotal(maxTotal); 
      connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); 

      ClientConfig config = new ClientConfig(); 
      config.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager); 
      config.connectorProvider(new ApacheConnectorProvider()); 
      config.property(ClientProperties.PROXY_URI, configuracion.getProperty("PROXY_URI")); // Debemos poner el PROXY del sistema 


      cliente = ClientBuilder.newBuilder().sslContext(sslContext).withConfig(config).build(); 

     }   
     return cliente; 
    } 

} 
संबंधित मुद्दे