我已经设置了用于请求日志记录的本地代理服务器,但是我的Java代码将忽略它并直接连接(Windows XP,JDK 1.7)。Web浏览器可以使用它。因此,我为讨论编写了测试代码,即使指定了(虚假)代理,它似乎也可以直接连接。使用伪造的代理,我期望连接失败,但是代码成功,直接连接:
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "12345");
System.setProperty("http.nonProxyHosts", "noNonProxyHost.com");
URL url = new URL("http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html");
InputStream in = url.openStream();
System.out.println("Connection via bogus proxy succeeded");
Run Code Online (Sandbox Code Playgroud)
该代码以独立Java,没有Maven,没有applet,没有容器的方式运行。我有直接的互联网连接。
在您使用 java.net.URL() 的情况下,如果无法在 http.proxyHost 和 http.proxyPort 处访问代理服务器,则它只会回退并尝试进行直接连接。如果成功,您将不会看到抛出异常,这就是为什么您的代码可以正常工作的原因。但是,当它尝试查找代理时,您应该会看到暂停。
下面的示例代码愉快地获取 URL 并显示它,即使在使用虚假代理设置运行时也不会出错。-Dhttp.proxyHost=bogus -Dhttp.proxyPort=2345 但如果设置正确,将与我的本地代理 localhost 端口 8888 通信
import java.io.*;
import java.net.URL;
import java.util.*;
public class URLClient {
private static String sUrl = "http://www.apache.org/";
public static void main(String[] args) {
try {
URL url = new URL(sUrl);
InputStream is = url.openStream();
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
String output = s.hasNext() ? s.next() : "";
System.out.println(output);
} catch(Throwable e) {
System.err.println("exception");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最初遇到的问题是 http.proxyHost 和 http.proxyPort 被忽略(谷歌让我回答你的问题)是这些设置被 apache.commons.httpClient 完全忽略,因为它使用自己的套接字,如here所述。 http://cephas.net/blog/2007/11/14/java-commons-http-client-and-http-proxies/
| 归档时间: |
|
| 查看次数: |
4176 次 |
| 最近记录: |