Pertanyaan Bagaimana saya bisa menggunakan proxy HTTP untuk permintaan JAX-WS tanpa menyetel properti seluruh sistem?


Saya memiliki aplikasi yang perlu membuat permintaan klien SOAP ke sistem di Internet, jadi perlu pergi meskipun proxy HTTP kami.

Seseorang dapat melakukan ini dengan menetapkan nilai sistem luas seperti properti sistem:

// Cowboy-style.  Blow away anything any other part of the application has set.
System.getProperties().put("proxySet", "true");
System.getProperties().put("https.proxyHost", HTTPS_PROXY_HOST);  
System.getProperties().put("https.proxyPort", HTTPS_PROXY_PORT);

Atau dengan mengatur ProxySelector default (juga pengaturan seluruh sistem):

// More Cowboy-style!  Every thing Google has found says to do it this way!?!?!
ProxySelector.setDefault(new MyProxySelector(HTTPS_PROXY_HOST, HTTPS_PROXY_PORT));

Tak satu pun dari ini adalah pilihan yang bijaksana jika ada kemungkinan subsistem lain ingin mengakses server web melalui proxy HTTP yang berbeda atau tanpa proxy. Menggunakan ProxySelector akan membiarkan saya mengkonfigurasi koneksi yang menggunakan proxy, tapi saya harus mencari tahu untuk setiap hal dalam aplikasi besar.

API yang masuk akal akan memiliki metode yang mengambil a java.net.Proxy objek seperti itu java.net.Socket(java.net.Proxy proxy) konstruktor tidak. Dengan cara itu pengaturan yang diperlukan bersifat lokal ke bagian sistem yang perlu mengaturnya. Apakah ada cara untuk melakukan ini dengan JAX-WS?

Saya tidak ingin mengatur konfigurasi proxy sistem-lebar.


32
2018-06-22 22:05


asal


Jawaban:


Jika Anda menggunakan JAX-WS Anda mungkin dapat mengatur pabrik soket yang digunakan oleh HttpURLConnection yang mendasarinya. Saya melihat tanda-tanda yang tidak jelas bahwa ini mungkin untuk SSL (lihat HTTPS SSLSocketFactory) tetapi saya tidak yakin apakah Anda dapat melakukannya untuk koneksi HTTP biasa (atau terus terang bagaimana cara kerjanya: kelas JAXWSProperties yang mereka rujuk tampak sebagai kelas JDK non-standar).

Jika Anda dapat mengatur pabrik soket maka Anda dapat mengkonfigurasi pabrik soket khusus yang menggunakan proksi khusus yang Anda inginkan.


5
2018-06-22 22:18



Saya merekomendasikan menggunakan ProxySelector kustom. Saya memiliki masalah yang sama dan itu bekerja hebat dan super fleksibel. Ini juga sederhana.

Inilah CustomProxySelector saya:

import org.hibernate.validator.util.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * So the way a ProxySelector works is that for all Connections made,
 * it delegates to a proxySelector(There is a default we're going to
 * override with this class) to know if it needs to use a proxy
 * for the connection.
 * <p>This class was specifically created with the intent to proxy connections
 * going to the allegiance soap service.</p>
 *
 * @author Nate
 */
class CustomProxySelector extends ProxySelector {

private final ProxySelector def;

private Proxy proxy;

private static final Logger logger = Logger.getLogger(CustomProxySelector.class.getName());

private List<Proxy> proxyList = new ArrayList<Proxy>();

/*
 * We want to hang onto the default and delegate
 * everything to it unless it's one of the url's
 * we need proxied.
 */
CustomProxySelector(String proxyHost, String proxyPort) {
    this.def = ProxySelector.getDefault();
    proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, (null == proxyPort) ? 80 : Integer.valueOf(proxyPort)));
    proxyList.add(proxy);
    ProxySelector.setDefault(this);
}

@Override
public List<Proxy> select(URI uri) {
    logger.info("Trying to reach URL : " + uri);
    if (uri == null) {
        throw new IllegalArgumentException("URI can't be null.");
    }
    if (uri.getHost().contains("allegiancetech")) {
        logger.info("We're trying to reach allegiance so we're going to use the extProxy.");
        return proxyList;
    }
    return def.select(uri);
}

/*
* Method called by the handlers when it failed to connect
* to one of the proxies returned by select().
*/
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
    logger.severe("Failed to connect to a proxy when connecting to " + uri.getHost());
    if (uri == null || sa == null || ioe == null) {
        throw new IllegalArgumentException("Arguments can't be null.");
    }
    def.connectFailed(uri, sa, ioe);
}

}


8
2018-05-09 17:37