ProxySelector:每个 URL 都有不同的代理

Ami*_*saf 5 java proxy uri http-proxy proxyselector

我试图了解 ProxySelector 类的工作原理。我当前的代码如下所示:

    URI uri = new URI("http://google.com");
    proxySelector.select(uri);
Run Code Online (Sandbox Code Playgroud)

据我了解,调用proxySelector.select(uri);此函数时应该返回相应 URI 的代理列表。但我不知道如何为每个 URI 设置代理。

我知道我可以使用该setDefault()方法设置默认代理,但据我了解,这将设置系统范围的代理,而不是特定URI.

我可能在这里遗漏了一些基本点,但如何为网址 A (例如http://google.com)设置一个代理并为网址 B (例如http://ebay.com)设置一个不同的代理,然后让系统每次连接到相应的url时都会自动选择正确的代理?

Mic*_*ksa 6

  1. 重写ProxySelector.select(URI uri)方法,您可以在其中实现自定义逻辑来为 URI 选择正确的代理或代理列表。

  2. ProxySelector要么通过调用将新的自定义设置为系统范围ProxySelector.setDefault(customProxySelector)

    的任何子类URLConnection都将使用ProxySelector,例如:

    URLConnection conn = url.openConnection();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者配置您将用来调用远程 URI 的框架,例如 Spring RestTemplate:

    HttpRoutePlanner routePlanner = new SystemDefaultRoutePlanner(new MyProxySelector());
    
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory 
        = new HttpComponentsClientHttpRequestFactory(
            HttpClientBuilder.create()
                .setRoutePlanner(routePlanner)
                .build());
    restTemplate = new RestTemplate(clientHttpRequestFactory);
    
    Run Code Online (Sandbox Code Playgroud)

select(URI uri)如果自定义逻辑无法确定 uri 的合适代理,最好回退到自定义中的默认 ProxySelector 。

请参阅我对ProxySelector 示例的其他回答。

网络和代理在Java 网络和代理第 4 段 ProxySelector)和ProxySelector Java 文档中得到了很好的解释。