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
Với sự giúp đỡ của Luca, tôi đã nhận nó làm:
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);
befo tái tạo lại ứng dụng khách Jersey, tạo một
URLConnectionClientHandler
mới và cung cấpHttpURLConnectionFactory
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 đỡ.
Hãy thử
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
conn = new URL(url).openConnection(proxy);
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
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
cảm ơn, điều này đã làm việc cho tôi. – whoami
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. –