Джерси-клиент + установить прокси-сервер
Привет, у меня есть 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);
Ответы
Ответ 1
Существует более простой подход, если вы хотите избежать большего количества библиотек в старых проектах, и нет необходимости в прокси-аутентификации:
Сначала вам нужен класс, который реализует 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
вместо Client.create
:
Client client = new Client(ch);
Конечно, вы можете настроить инициализацию прокси-сервера в ConnectionFactory
.
Ответ 2
Ответ удачного пользователя будет работать.
Здесь моя версия:
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);
Ответ 3
Здесь вы идете:
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/");
Ответ 4
System.setProperty("http.proxyHost","your proxy url");
System.setProperty("http.proxyPort", "your proxy port");
Ответ 5
Я взял user67871 и немного изменил его. Что нравится в этом подходе, так это то, что он работает с системным прокси-сервером в Windows. Если вы работаете в Windows и настраиваете прокси-сервер в IE, тогда этот код выберет это. Когда вы запускаете Fiddler, он также устанавливает системный прокси, поэтому это позволяет легко использовать Джерси и 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<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);
Ответ 6
Прежде всего, я создал этот класс
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() через порт прокси.
Это сработало для меня, и оно должно работать и для вас. Обратите внимание, что я использую Jersey 1.8, но он также должен работать на Jersey 2
Ответ 7
SDolgy. Я сделал это, добавив 3 функции в экземпляр клиента в Джерси:
Включает 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<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;
}
}
Ответ 8
Был в состоянии настроить прокси, переопределяющий конфигурацию клиента, предоставленную newClient. Это работало для версии 24.
return ClientBuilder.newClient(new ClientConfig().connectorProvider(new ConnectorProvider() {
//figured this out from digging through jersey source code
@Override
public Connector getConnector(Client client, Configuration runtimeConfig) {
HttpUrlConnectorProvider customConnProv = new HttpUrlConnectorProvider();
customConnProv.connectionFactory(new ConnectionFactory() {
@Override
public HttpURLConnection getConnection(java.net.URL url) throws IOException {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
return (HttpURLConnection)url.openConnection(proxy);
}
});
return customConnProv.getConnector(client, runtimeConfig);
}
}));