在测试中,我这样做:

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


然后打开一个连接:

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


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

我想念什么?

最佳答案

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

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

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


该连接实际上已创建。在您的代码中,url.openConnection()不会物理上建立与URL的连接。您需要调用connection.connect()(或隐式执行连接的操作)。 openConnection()的Javadocs中提到了这一点:


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

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


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

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


  处理程序:嘿,伙计,我正在尝试访问java.example.org,我应该使用代理吗?
  
  ProxySelector:您打算使用哪种协议?
  
  处理程序:当然是http!
  
  ProxySelector:在默认端口上?
  
  处理程序:让我检查一下...。是的,默认端口。
  
  ProxySelector:我知道了。然后,您应使用端口8080上的webcache.example.com作为代理。
  
  经理:谢谢。 老兄,webcache.example.com:8080似乎没有响应!还有其他选择吗?
  
  ProxySelector:当当! OK,也尝试在端口8080上尝试webcache2.example.com。
  
  经理:好的。似乎正在工作。谢谢。
  
  ProxySelector:不出汗。再见


(请注意,作者确实提到这是一个点缀的对话框。)

09-26 17:09