在测试中,我这样做:
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "1080");
然后打开一个连接:
connection = (HttpURLConnection)url.openConnection();
if (connection.usingProxy()) {
throw new Nope();
}
正在使用代理,否则连接将失败。但是usingProxy()
正在返回false。
我错过了什么?
答案 0 :(得分:2)
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 :Dang!好的,也可以在端口8080上尝试webcache2.example.com。
处理程序:好的。似乎工作。感谢。
ProxySelector :没有汗水。再见。
(注意作者确实提到它是一个带缀饰的对话框。)