我试图了解ProxySelector类是如何工作的。我当前的代码如下所示:
URI uri = new URI("http://google.com");
proxySelector.select(uri);
我知道在调用proxySelector.select(uri);
时,假设返回相应URI的代理列表。但我没有看到如何为每个URI设置代理。
我知道我可以使用setDefault()
方法设置默认代理,但据我所知,这将设置系统范围的代理,而不是特定URI
的代理。
我可能在这里遗漏了一些基本点,但是我如何为url A设置一个代理(例如http://google.com)和为url B设置一个不同的代理(例如http://ebay.com),然后让系统在每次连接时自动选择正确的代理相应的网址?
ProxySelector.select(URI uri)
方法,您可以在其中实现自定义逻辑,以选择正确的代理或URI的代理列表。ProxySelector
将新的,自定义的ProxySelector.setDefault(customProxySelector)
设置为系统范围。
URLConnection
的任何子类都将使用ProxySelector
,例如:
URLConnection conn = url.openConnection();
HttpRoutePlanner routePlanner = new SystemDefaultRoutePlanner(new MyProxySelector());
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
= new HttpComponentsClientHttpRequestFactory(
HttpClientBuilder.create()
.setRoutePlanner(routePlanner)
.build());
restTemplate = new RestTemplate(clientHttpRequestFactory);
如果自定义逻辑没有为uri确定合适的代理,最好在自定义select(URI uri)
中回退到默认的ProxySelector。
请参阅我的ProxySelector example的其他答案。
网络和代理在Java Networking and Proxies(第4段ProxySelector)和ProxySelector Java docs中得到了很好的解释。