HttpUrlConnection.usingProxy()何时返回true?

时间:2015-12-02 16:41:48

标签: java networking

在测试中,我这样做:

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

然后打开一个连接:

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

正在使用代理,否则连接将失败。但是usingProxy()正在返回false。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 实际创建了连接。在您的代码中,url.openConnection()并未实际建立与URL的连接。您需要调用connection.connect()(或隐式执行连接的操作)。这在openConnection()的Javadocs中提到:

      

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

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

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

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

      

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

         

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

         

    处理程序:http,当然!

         

    ProxySelector :在默认端口上?

         

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

         

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

         

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

         

    ProxySelector :Dang!好的,也可以在端口8080上尝试webcache2.example.com。

         

    处理程序:好的。似乎工作。感谢。

         

    ProxySelector :没有汗水。再见。

    (注意作者确实提到它是一个带缀饰的对话框。)