web-dev-qa-db-ja.com

システム全体のプロパティを設定せずに、JAX-WSリクエストにHTTPプロキシを使用するにはどうすればよいですか?

インターネット上のシステムに対してSOAPクライアント要求を行う必要があるアプリケーションがあるため、HTTPプロキシを経由する必要があります。

これを行うには、システムプロパティなどのシステム全体の値を設定します。

_// 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);
_

または、デフォルトのProxySelectorを設定する(これもシステム全体の設定):

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

他のサブシステムが異なるHTTPプロキシを介して、またはプロキシなしでWebサーバーにアクセスする可能性がある場合、これらはどちらも賢明な選択ではありません。 ProxySelectorを使用すると、プロキシを使用する接続を構成できますが、巨大なアプリケーション内のすべてのものについてそれを把握する必要があります。

妥当なAPIには、Java.net.Socket(Java.net.Proxy proxy)コンストラクターと同じように、_Java.net.Proxy_オブジェクトを取得するメソッドがあります。このようにして、必要な設定は、それらを設定する必要があるシステムの部分に対してローカルです。 JAX-WSでこれを行う方法はありますか?

システム全体のプロキシ構成を設定したくありません。

33
jbindel

JAX-WSを使用している場合は、基になるHttpURLConnectionが使用するソケットファクトリを設定できる場合があります。これはSSLで可能であるという漠然とした兆候が見られますが( HTTPS SSLSocketFactory を参照)、通常のHTTP接続でそれを実行できるかどうかはわかりません(または、率直に言って、それがどのように機能するか:JAXWSPropertiesクラス参照は非標準のJDKクラスのようです)。

ソケットファクトリを設定できる場合は、必要な特定のプロキシを使用するカスタムソケットファクトリを構成できます。

5
Femi

カスタムProxySelectorの使用をお勧めします。私は同じ問題を抱えていましたが、それはうまく機能し、非常に柔軟です。それも簡単です。

これが私のCustomProxySelectorです。

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

}

10
Uncle Iroh