在测试中,我这样做:
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:不出汗。再见
(请注意,作者确实提到这是一个点缀的对话框。)