web-dev-qa-db-ja.com

ジャージークライアント+プロキシの設定

こんにちは私はファイルをアップロードするために使用するジャージクライアントを持っています。ローカルで使用してみましたが、すべて正常に動作します。しかし、実稼働環境では、プロキシを設定する必要があります。私は数ページを閲覧しましたが、正確な解決策を得ることができませんでした。誰か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);
13
user732362

レガシープロジェクトでより多くのライブラリを避けたい場合で、プロキシ認証の必要がない場合は、より簡単なアプローチがあります。

まず、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でプロキシの初期化をカスタマイズできます。

15
luckyluke

ラッキールークの答えはうまくいくでしょう。ここに私のバージョン:

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);
12
sehari24jam
System.setProperty("http.proxyHost","your proxy url");
System.setProperty("http.proxyPort", "your proxy port");
2
Ajeesh

どうぞ:

 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/");
2
sdolgy

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);
0
Sarel Botha

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;
     }

 }
0
David Dominguez

まず、このクラスを作成しました

    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でも機能するはずです。

0
AIMABLE

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);
            }
        }));


0
Eugen