ジャージークライアントにプロキシサーバーを設定したいと思います。
(http.proxyHostなどのJVM引数を使用して)アプリケーション全体にプロキシを構成したくないので、Apacheクライアントを使用しません。
ここで、HttpUrlConnectionFactoryを介してHttpUrlConnectionを提供することでそれを行うオプションがあることを読みましたが、コード例が見つかりませんでした。
誰かが私がそれを行う方法を知っていますか?
ありがとう!
14884 次
3 に答える
11
ルカの助けを借りて、私はそれを成し遂げました:
実装
HttpURLConnectionFactory
し、メソッドをオーバーライドしますgetHttpURLConnection
。私の実装は(Lucaのおかげで):Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); return new HttpURLConnection(url, proxy);
ジャージークライアントをインスタンス化する前に、新しいを作成し、コンストラクターで
URLConnectionClientHandler
を提供します。HttpURLConnectionFactory
次に、新しいを作成し、コンストラクターClient
でを提供します。私のコード:ClientHandler
Client
URLConnectionClientHandler urlConnectionClientHandler = new URLConnectionClientHandler(new MyHttpURLConnectionFactory()); _client = new Client(urlConnectionClientHandler);
それがお役に立てば幸いです。
于 2012-05-01T07:38:47.710 に答える
5
まず、このクラスを作成しました
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);
webProxy.getWeserviceHostをproxyHostに置き換え、webProxy.getWebserviceProxyPort()をプロキシポートに置き換えます。
これは私にとってはうまくいきましたし、あなたにとってもうまくいくはずです。私はJersey1.8を使用していますが、Jersey2でも機能するはずです。
于 2014-02-15T12:40:34.353 に答える
2
試す
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
conn = new URL(url).openConnection(proxy);
于 2012-04-30T14:28:11.263 に答える