ProxySelector determines which resource has to be requested via proxy as a result return List<Proxy>
Methods of ProxySelector class :
Method | Description |
---|---|
connectFailed() | This method is invoked when failed to establish a connection |
getDefault() | This method is used for retrieving the system-wide ProxySelector |
select() | This method returns Proxy to access resource |
setDefault() | This method is used to set or unset the system-wide ProxySelector |
Illustration: Sample Code for logic
Java
// Java Program to illustrate ProxySelector Class // of java.net package // only creating methods here // Importing standard input output classes import java.io.IOException; // Importing classes from java.net package import java.net.InetSocketAddress; import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; // Importing List and ArrayList as utility classes from // java.util package import java.util.ArrayList; import java.util.List; // Class 1 // Helper class extending ProxySelector class public class PrivateDataProxy extends ProxySelector { // According to API we need to return List<Proxy> // even if we return only one element, so // Creating List class object of Proxy type private final List<Proxy> noProxy = new ArrayList<>(); private final List<Proxy> proxies = new ArrayList<>(); // Constructor of this class public PrivateDataProxy() { // If no proxy required to access resource // use Proxy.NO_PROXY noProxy.add(Proxy.NO_PROXY); // Creating InetSocketAddress, and // secure.connection.com doesn't exist 443 is an // https port InetSocketAddress inetSocketAddress = new InetSocketAddress( "secure.connection.com" , 443 ); // Now creating http proxy Proxy proxy = new Proxy(Proxy.Type.HTTP, inetSocketAddress); // Finally adding proxy into proxy list proxies.add(proxy); } // Method 1 of this class //@Override public List<Proxy> select(URI uri) { if (uri.getPath().startsWith( "/confidential" )) { // If URI path starts with '/confidential' then // use proxy server return proxies; } // If url don't start with '/confidential' then // no need in proxy return noProxy; } // Method 2 of this class // @Override public void connectFailed(URI arg0, SocketAddress arg1, IOException arg2) { // Properly handle connection failing } } |
Implementation: Using custom ProxySelector
Java
// Java Program to illustrate ProxySelector Class // of java.net package // Using custom ProxySelector // Importing required classes from respective packages import java.io.IOException; import java.net.Proxy; import java.net.ProxySelector; import java.net.URISyntaxException; import java.net.URL; import java.util.List; // Main class public class ProxySelectorDemo { // Main driver method public static void main(String[] args) throws URISyntaxException, IOException { // Passing the string uri PrivateDataProxy privateDataProxy = new PrivateDataProxy(); // The setting the system-wide proxy selector ProxySelector.setDefault(privateDataProxy); // Print the default value // using getDefault() method System.out.println( "Default value: " + ProxySelector.getDefault()); // Display message only System.out.println( "Getting proxy for /confidential" ); // Passing the string URL String confidentialUrl // Now, calling the constructor of the URL class URL confidential = new URL(confidentialUrl); // Requiring an proxy for url List<Proxy> confidentialProxies = privateDataProxy.select(confidential.toURI()); // Show the proxy that was selected System.out.println( "Proxy to use : " + confidentialProxies.get( 0 )); // Display message only System.out.println( "Getting proxy for /non-confidential" ); // passing the string URL // Custom URL as input String nonConfidentialURL // Now, calling the constructor of the URL class URL nonConfidential = new URL(nonConfidentialURL); // Requiring an proxy for URL List<Proxy> nonConfidentialProxies = privateDataProxy.select( nonConfidential.toURI()); // Display the proxy that was selected System.out.println( "Proxy to use : " + nonConfidentialProxies.get( 0 )); } } |
Output:
Default value: entity.PrivateDataProxy@5cad8086 Getting proxy for /confidential Proxy to use : HTTP @ secure.connection.com:443 Getting proxy for /non-confidential Proxy to use : DIRECT