Java的.net.ProxySelector类在Java中
ProxySelector 确定哪些资源必须通过代理请求作为结果返回List
ProxySelector 类的方法: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
插图:逻辑示例代码
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
// even if we return only one element, so
// Creating List class object of Proxy type
private final List noProxy = new ArrayList<>();
private final List 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 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
}
}
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
= "https://www.download.com/confidential";
// Now, calling the constructor of the URL class
URL confidential = new URL(confidentialUrl);
// Requiring an proxy for url
List 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
= "https://www.download.com/non-confidential";
// Now, calling the constructor of the URL class
URL nonConfidential = new URL(nonConfidentialURL);
// Requiring an proxy for URL
List nonConfidentialProxies
= privateDataProxy.select(
nonConfidential.toURI());
// Display the proxy that was selected
System.out.println("Proxy to use : "
+ nonConfidentialProxies.get(0));
}
}
实现:使用自定义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
= "https://www.download.com/confidential";
// Now, calling the constructor of the URL class
URL confidential = new URL(confidentialUrl);
// Requiring an proxy for url
List 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
= "https://www.download.com/non-confidential";
// Now, calling the constructor of the URL class
URL nonConfidential = new URL(nonConfidentialURL);
// Requiring an proxy for URL
List nonConfidentialProxies
= privateDataProxy.select(
nonConfidential.toURI());
// Display the proxy that was selected
System.out.println("Proxy to use : "
+ nonConfidentialProxies.get(0));
}
}
输出:
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