Jak mogę użyć serwera proxy HTTP dla żądania JAX-WS bez ustawiania właściwości dla całego systemu?

Mam aplikację, która musi wysłać żądanie klienta SOAP do systemu w Internecie, więc musi przejść przez nasz serwer proxy HTTP.

Można to zrobić, ustawiając wartości dla całego systemu, takie jak Właściwości systemu:

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

Lub przez ustawienie domyślnego Proxyselectora (również ustawienia dla całego systemu):

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

Żadna z tych opcji nie jest mądrym wyborem, jeśli istnieje możliwość, że inne podsystemy chcą uzyskać dostęp do serwerów WWW za pośrednictwem różnych proxy HTTP lub bez żadnego proxy. Użycie ProxySelector pozwoli mi skonfigurować, które połączenia używają proxy, ale musiałbym to rozgryźć dla każdej pojedynczej rzeczy w ogromnej aplikacji.

Rozsądne API miałoby metodę, która zajęłaby obiekt java.net.Proxy, tak jak robi to Konstruktor java.net.Socket(java.net.Proxy proxy). W ten sposób niezbędne ustawienia są lokalne dla części systemu, która musi je ustawić. Czy jest jakiś sposób, aby to zrobić z JAX-WS?

Nie chcę ustawiać konfiguracji proxy dla całego systemu.

Author: Tommy Herbert, 2011-06-23

2 answers

Jeśli używasz JAX-WS, możesz ustawić fabrycznie gniazda używane przez bazowy HttpURLConnection. Widzę niejasne oznaki, że jest to możliwe dla SSL (zobacz HTTPS SSLSocketFactory), ale nie jestem pewien, czy możesz to zrobić dla zwykłych połączeń HTTP (lub szczerze mówiąc, Jak to działa: Klasa jaxwsproperties, do której się odwołują, wydaje się być niestandardową klasą JDK).

Jeśli możesz ustawić fabrykę gniazd, możesz skonfigurować niestandardową fabrykę gniazd, która używa konkretne proxy, które chcesz.

 5
Author: Femi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 10:17:04

Zalecam użycie niestandardowego Proxyselektora. Miałem ten sam problem i działa świetnie i jest super elastyczny. To też jest proste.

Oto Mój 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);
}

}

 9
Author: Uncle Iroh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-09 17:37:13