泽西客户端+设置代理

嗨,我有一个用于上传文件的jersey客户端。 我尝试在本地使用它,一切正常。 但在生产环境中,我要设置代理。 我浏览了几页,但无法得到确切的解决方案。 有人可以帮我这个吗?

这是我的客户代码:

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

如果您想在遗留项目中避免使用更多库,并且不需要代理身份validation,则有一种更简单的方法:

首先,您需要一个实现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 Constructor而不是Client.create

 Client client = new Client(ch); 

当然,您可以在ConnectionFactory自定义Proxy的初始化。

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

干得好:

  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/"); 
 System.setProperty("http.proxyHost","your proxy url"); System.setProperty("http.proxyPort", "your proxy port"); 

我拿了用户67871并改了一下。 这种方法的好处在于它可以与Windows上的系统代理一起使用。 如果您使用的是Windows,并且在IE中配置代理,则此代码将选择该代理。 当你运行Fiddler时,它还会设置系统代理,这样就可以很容易地一起使用Jersey和Fiddler。

  Client client = new Client(new URLConnectionClientHandler( new HttpURLConnectionFactory() { Proxy p = null; @Override public HttpURLConnection getHttpURLConnection(URL url) throws IOException { try { if (p == null) { List 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); 

首先,我创建了这个类

  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。

这对我有用,它也适合你。 请注意,我使用的是Jersey 1.8,但它也适用于Jersey 2

SDolgy。 我这样做了,在Jersey客户端实例化中添加了3个function:启用SSL TLSv1.1(需要JVM> = 1.7),配置conex。 池。 要增加连接,请设置系统代理。

  # 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 socketFactoryRegistry = RegistryBuilder.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; } }