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