2010-11-01 38 views
4

当使用Java中的proxyHost,proxyPortnonProxyHosts属性修改URL连接时,通配符在nonProxyHosts属性中的有效用法是什么?我可以做任何或全部以下的事情吗?Java中nonProxyHosts属性的有效正则表达式格式是什么?

  1. 明确的服务器名称:nonProxyHosts=server.company.com
  2. 在子域中的任何服务器:nonProxyHosts=*.local.company.com
  3. 通过IP地址特定服务器:nonProxyHosts=192.168.101.110
  4. 在子网中的任何服务器:nonProxyHosts=192.168.101.*
  5. 在子网中的任何服务器:nonProxyHosts=192.168.101/23

还有其他类型的模式?

谢谢!

回答

4

我认为属性值的解释是它定义了一个正则表达式池。如果主机匹配池中的任何表达式(主机和表达式都被强制为小写),则不使用代理。

编辑:
还是不完全。它看起来像sun.misc.RegexpPool只处理以“*”开头或结尾的字符串。所以我想这真的归结为只是前缀和后缀通配符...

EDIT2:
一个快速的方法来测试是使用:

ProxySelector.getDefault().select(URI.create("...myURI...")); 

将返回List<Proxy>。默认的代理选择器是sun.net.spi.DefaultProxySelector,但它可以被覆盖。

+0

快速的方式(Edit2)就像一个魅力。您只需测试返回到列表中的代理类型 – bsorrentino 2015-07-12 21:32:54

1

http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html说:

http.nonProxyHosts表示应当通过代理服务器太直接,而不是 连接的主机。该值可以是一个主机列表,每个主机分别由|和 另外可以使用通配符(*)来匹配。例如:

-Dhttp.nonProxyHosts =“*。foo.com | localhost”。

+0

谢谢,但这正是我想要的定义。我可以在IP地址中使用通配符吗?我可以使用CIDR表示法吗?谢谢! – 2010-11-02 13:56:08

+0

我解释说,因为CIDR是不可能的,但是你可以在IP中使用通配符(当IP被请求时)和主机名(当某些东西被主机名请求时)。 – thejh 2010-11-02 14:09:52

1

查看OpenJDK源文件,获取sun.net.spi.DefaultProxySelectorsun.misc.Regexp类。在那里为Sun JVM处理nonProxyHosts系统属性。根据@author javadoc评论,Regexp类是由Java人自己写的,James Gosling编写的。它所做的全部匹配*正则表达式,字符串中的任何位置(开始,中间和结束)。因此,您可以执行部分​​主机名以及部分IP地址(例如host12*10.*)以匹配以host12开头的所有主机名或以10.开头的所有IP。此外,DefaultProxySelector在代理URL中检测到localhost127.0.0.1,并自动排除它们。因此,就Sun JVM而言,您无需将其添加到您的nonProxyHosts

现在,在Weblogic中,他们似乎有自己的weblogic.net类,它们使用相同的Sun System网络属性进行操作,但并不总是相同的方式。我没有Weblogic源代码,但我的观点是,它不仅仅是Sun JDK使用这些属性。由于缺陷或不同的语义或对Sun行为和文档的解释,YMMV在那里有不同的代理实现。

我引用的OpenJDK源代码版本是来自openjdk-6的http://download.java.net/openjdk/jdk6/

+0

伟大的代码解析。这几乎回答了这个问题,也是我的好奇心。 – aff 2015-06-05 04:45:33

相关问题