こんにちは私はファイルをアップロードするために使用するジャージクライアントを持っています。ローカルで使用してみましたが、すべて正常に動作します。しかし、実稼働環境では、プロキシを設定する必要があります。私は数ページを閲覧しましたが、正確な解決策を得ることができませんでした。誰かplsはこれで私を助けることができますか?
これが私のクライアントコードです:
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);
レガシープロジェクトでより多くのライブラリを避けたい場合で、プロキシ認証の必要がない場合は、より簡単なアプローチがあります。
まず、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);
}
}
2つ目は、com.Sun.jersey.client.urlconnection.URLConnectionHandler
をインスタンス化することです。
URLConnectionClientHandler ch = new URLConnectionClientHandler(new ConnectionFactory());
3つ目は、Client.create
の代わりにClient
コンストラクターを使用することです。
Client client = new Client(ch);
もちろん、ConnectionFactory
でプロキシの初期化をカスタマイズできます。
ラッキールークの答えはうまくいくでしょう。ここに私のバージョン:
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);
System.setProperty("http.proxyHost","your proxy url");
System.setProperty("http.proxyPort", "your proxy port");
どうぞ:
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/");
User67871を取得して、少し変更しました。このアプローチの良いところは、Windowsのシステムプロキシで機能することです。 Windowsを使用していて、IEでプロキシを構成する場合、このコードはそれを取得します。Fiddlerを実行している場合は、システムプロキシも設定されるため、Jerseyを非常に簡単に使用できます。とフィドラーが一緒に。
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);
SDolgy。私はこれを行い、Jerseyクライアントのインスタンス化に3つの機能を追加しました。SSLTLSv1.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;
}
}
まず、このクラスを作成しました
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でも機能するはずです。
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);
}
}));