java忽略代理设置

时间:2015-01-17 20:46:41

标签: java proxy

我已经为请求记录设置了本地代理服务器,但我的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");

代码作为独立Java运行,没有Maven,没有applet,没有容器。我有直接的互联网连接。

2 个答案:

答案 0 :(得分:1)

在使用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");
        }
      }
    }


我最初忽略了http.proxyHost和http.proxyPort的问题(谷歌引导我提出你的问题)是apache.commons.httpClient完全忽略了这些设置,因为它使用自己的套接字,如此处所述。 http://cephas.net/blog/2007/11/14/java-commons-http-client-and-http-proxies/

答案 1 :(得分:0)

我最近遇到过类似的问题。首先,来自Daemon42的上述答案的一部分很好地解释了为什么虚假代理服务器没有导致程序失败:

  

如果无法通过http.proxyHost和http.proxyPort访问代理服务器,那么它就会退回并尝试进行直接连接。如果成功,您将看到没有抛出异常,这就是您的代码无错误地运行的原因。您应该在尝试查找代理时看到暂停。

但实际问题是,为什么Java应用程序不使用通过操作系统配置的代理服务器。如Oracle文档(https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html)中所述,默认情况下Java不会评估系统代理设置。为此,您必须设置系统属性的值" java.net.useSystemProxies"价值"真"。

  

您可以在命令行上设置该系统属性,也可以编辑JRE安装文件jre / lib / net.properties,这样您只需在给定系统上更改一次。