2010-11-01 37 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

相關問題