Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use an HTTP proxy for a JAX-WS request without setting a system-wide property?

I have an application that needs to make a SOAP client request to a system on the Internet, so it needs to go though our HTTP proxy.

One can do this by setting system-wide values such as system properties:

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

Or by setting the default ProxySelector (also a system-wide setting):

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

Neither of these is a wise choice if there is the possibility of other subsystems wanting to access web servers via different HTTP proxies or without any proxy. Using the ProxySelector would let me configure which connections use the proxy, but I would have to figure that out for every single thing in the huge application.

A reasonable API would have a method that took a java.net.Proxy object just like the java.net.Socket(java.net.Proxy proxy) constructor does. That way the necessary settings are local to the part of the system that needs to set them. Is there some way to do this with a JAX-WS?

I do not want to set a system-wide proxy configuration.

like image 733
jbindel Avatar asked Jun 22 '11 22:06

jbindel


People also ask

How do I manually use a proxy server?

To set up a proxy server connection manuallySelect the Start button, then select Settings > Network & Internet > Proxy. Under Manual proxy setup, turn on Use a proxy server. Do the following: In the Address and Port boxes, enter the proxy server name or IP address and port (optional) in the respective boxes.

What is HTTP request proxy?

What Does HTTP Proxy Mean? An HTTP Proxy serves two intermediary roles as an HTTP Client and an HTTP Server for security, management, and caching functionality. The HTTP Proxy routes HTTP Client requests from a Web browser to the Internet, while supporting the caching of Internet data.


1 Answers

I recommend using a custom ProxySelector. I had the same problem and it works great and is super flexible. It's simple too.

Here's my 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);     } } 
like image 160
Uncle Iroh Avatar answered Sep 27 '22 21:09

Uncle Iroh