配置代理到Jersey客户端
我想为我的Jersey客户端配置代理服务器。
我不想将代理配置到整个应用程序(使用JVM参数,如http.proxyHost),而不是使用Apache客户端。
我在这里读到有一个选项可以通过HttpUrlConnectionFactory提供HttpUrlConnection,但我找不到任何代码示例。
有谁知道我该怎么做?
谢谢!
在Luca的帮助下,我完成了它:
-
实现
HttpURLConnectionFactory
,并重写方法getHttpURLConnection
,我的实现是(感谢Luca):Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);
-
在实例化Jersey客户端之前,创建一个新的
URLConnectionClientHandler
,并在其构造函数中提供您的HttpURLConnectionFactory
。 然后创建一个新的Client
,并在Client
构造函数中提供ClientHandler
。 我的代码:URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory()); _client = new Client(urlConnectionClientHandler);
希望有所帮助。
首先,我创建了这个类
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
尝试
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); conn = new URL(url).openConnection(proxy);