在Java中使用proxyHost
,proxyPort
和nonProxyHosts
属性修改URL
连接时,nonProxyHosts
中通配符的有效用途是什么?属性?我可以做以下任何一项或全部吗?
nonProxyHosts=server.company.com
nonProxyHosts=*.local.company.com
nonProxyHosts=192.168.101.110
nonProxyHosts=192.168.101.*
nonProxyHosts=192.168.101/23
是否有其他类型的模式?
谢谢!
答案 0 :(得分:4)
我认为属性值的解释是它定义了一个正则表达式池。如果主机匹配池中的任何表达式(主机和表达式都被强制为小写),则不使用代理。
编辑:
或者不完全。看起来sun.misc.RegexpPool
只处理以“*”开头或结尾的字符串。所以我想这真的可以归结为前缀和后缀通配符......
EDIT2:
一种快速的测试方法是使用:
ProxySelector.getDefault().select(URI.create("...myURI..."));
将返回List<Proxy>
。默认代理选择器是sun.net.spi.DefaultProxySelector
,但可以覆盖它。
答案 1 :(得分:2)
http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html说:
http.nonProxyHosts表示应该直接连接的主机,而不是 通过代理服务器。该值可以是主机列表,每个主机由|,和分隔 此外,通配符(*)可用于匹配。例如:
-Dhttp.nonProxyHosts = “* foo.com |。本地主机”。
答案 2 :(得分:1)
查看sun.net.spi.DefaultProxySelector
和sun.misc.Regexp
类的OpenJDK源代码。在那里为Sun JVM处理nonProxyHosts
System属性。根据{{1}} javadoc评论,Regexp类是由Java人本人James Gosling编写的。它所做的只是匹配@author
正则表达式,在字符串中的任何位置(开始,中间和结束)。因此,您可以执行部分主机名以及部分IP地址,例如*
或host12*
,以匹配以10.*
开头的所有主机名或以host12
开头的所有IP。此外,10.
会在代理网址中检测到DefaultProxySelector
和localhost
,并自动将其排除在外。因此,就Sun JVM而言,您无需将这些内容添加到127.0.0.1
。
现在,在Weblogic中,它们似乎有自己的nonProxyHosts
类,这些类使用相同的Sun System网络属性,但并不总是以相同的方式运行。我没有方便的Weblogic源,但我的观点是,不只是Sun JDK使用这些属性。由于存在错误或不同的语义或对Sun行为和文档的解释,YMMV具有不同的代理实现。
我引用的OpenJDK源版本来自http://download.java.net/openjdk/jdk6/的openjdk-6。