2015-12-02 136 views
2

在一个测试,我做的:何时HttpUrlConnection.usingProxy()返回true?

System.setProperty("http.proxyHost", "localhost"); 
System.setProperty("http.proxyPort", "1080"); 

,然后打开一个连接:

connection = (HttpURLConnection)url.openConnection(); 
if (connection.usingProxy()) { 
    throw new Nope(); 
} 

正在使用的代理服务器,否则连接会失败。但usingProxy()返回false。

我错过了什么?

回答

2

this page中有相当多的细节讨论代理可以在应用程序中设置的不同方式,以及连接如何使用代理。

您还可以从调试代码本身获得重要的理解,从而得出与页面中的描述相符的结论。

基本上,usingProxy()返回true,当满足以下条件:

  1. 连接实际上是创建。在您的代码中,url.openConnection()不会实际建立到该URL的连接。您需要调用connection.connect()(或隐式执行连接的操作)。这在openConnection()的Javadoc中提到:

    应该注意的是,URLConnection实例在创建时并不建立实际的网络连接。只有在调用URLConnection.connect()时才会发生这种情况。

  2. 代理集(使用系统属性或通过java.net.Proxy类)指向可访问的地址。所以请确保代理localhost:1080是一个有效的代理。

关于第二点的更多细节。 HttpUrlConnection依赖ProxySelector类(在上面的页面中提到),该类查找注册的代理地址。默认ProxySelector将忠实地获取您在系统属性中设置的代理,并且HttpUrlConnection将尝试访问代理。如果不可用,它将要求ProxySelector提供另一个代理(如果存在其他代理)。

我发现,包含在文档中的对话是一个很好的解释(斜体突出的部分尝试连接到代理):

处理器:嘿,伙计,我试图访问java.example.org,我应该使用代理吗?

ProxySelector:您打算使用哪种协议?

Handler:http,当然!

ProxySelector:在默认端口?

处理程序:让我检查....是的,默认端口。

ProxySelector:我明白了。然后,您将在端口8080上使用webcache.example.com作为代理。

处理程序:谢谢。 <暂停>伙计,webcache.example.com:8080似乎没有回应!还有其他选择吗?

ProxySelector:当!好的,请尝试在端口8080上使用webcache2.example.com。

处理程序:当然。似乎工作。谢谢。

ProxySelector:没有汗水。再见。

(A注意,作者未提到它是一个富有装饰性对话。)

+0

对话是一个滑稽的灾难,它甚至不是准确的。选择器不会提出任何问题。它提供了参数。 – EJP

+0

@EJP的确,作者提到他或她“稍微修饰一些”。我想突出说明在选择下一个代理之前访问代理的部分。 – manouti