繁体   English   中英

ProxySelector:每个 URL 的不同代理

[英]ProxySelector: Different Proxy for Each URL

我试图了解 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 )设置一个不同的代理,然后有每次连接到对应的url时系统自动选择正确的代理?

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

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

    URLConnection ProxySelector类都将使用ProxySelector ,例如:

     URLConnection conn = url.openConnection();
  3. 或配置您将用于调用远程 URI 的框架,例如 Spring RestTemplate:

     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 示例的其他答案。

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

实际上,只需使用增强的 ProxySelector,它就可以在没有任何反射的情况下工作得很好,该 ProxySelector 支持特定 url 的白名单,并将其余部分传递给委托(也称为默认)ProxySelector。

public class DelegatingProxySelector extends ProxySelector {

    private final Set<URI> allProxiedUri = new HashSet<>();

    private String proxyHost;
    private Integer proxyPort;

    private final ProxySelector delegate;

    public DelegatingProxySelector(
        String proxyHost, Integer proxyPort, ProxySelector delegate) {
        this.proxyHost = proxyHost;
        this.proxyPort = proxyPort;
        this.delegate = delegate;
    }

    @Override
    public List<Proxy> select(final URI uri) {
        if (allProxiedUri.contains(uri)) {
            final InetSocketAddress proxyAddress = InetSocketAddress
                .createUnresolved(proxyHost, proxyPort);
            return Collections.singletonList(new Proxy(Type.HTTP, proxyAddress));
        }
        return delegate.select(uri);
    }

    @Override
    public void connectFailed(final URI uri, final SocketAddress sa, final IOException ioe) {
        System.err.println("Unable to reach uri " + uri + " via proxy: " + ioe.getMessage());
    }
    
    public void addProxiedUri(URI uri) {
        allProxiedUri.add(uri);
    }
}

...

final DelegatingProxySelector delegatingProxySelector = new DelegatingProxySelector("localhost", 3128, ProxySelector.getDefault());
ProxySelector.setDefault(delegatingProxySelector);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM