📜  Java的.net.ProxySelector类在Java中

📅  最后修改于: 2022-05-13 01:55:17.054000             🧑  作者: Mango

Java的.net.ProxySelector类在Java中

ProxySelector 确定哪些资源必须通过代理请求作为结果返回List

ProxySelector 类的方法:

MethodDescription
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