2010-09-22 41 views
16

我有以下情形:有道檢查URL平等

URL u1 = new URL("http://www.yahoo.com/"); 
URL u2 = new URL("http://www.yahoo.com"); 

if (u1.equals(u2)) { 
    System.out.println("yes"); 
} 
if (u1.toURI().equals(u2.toURI())) { 
    System.out.println("uri equality"); 
} 
if (u1.toExternalForm().equals(u2.toExternalForm())) { 
    System.out.println("external form equality"); 
} 
if (u1.toURI().normalize().equals(u2.toURI().normalize())) { 
    System.out.println("uri normalized equality"); 
} 

這些檢查都不是成功的。只有路徑不同:u1的路徑爲「/」,而u2的路徑爲「」。這些URL是否指向相同的資源,並且有沒有辦法讓我在不打開連接的情況下檢查這樣的事情?我誤解了有關URL的基本知識嗎?

編輯我應該說明一個非hacky檢查是需要的。說空路== /?是否合理?我希望不會有這種代碼

回答

21

從2007年的JavaOne:

第二個謎,恰當地名爲「集更多歡樂」有用戶創建由HashMap的鍵或幾個URL對象。再一次,大多數觀衆都無法猜出正確的答案。

受衆在這裏學到的重要東西是URL對象的equals()方法實際上是打破。在這種情況下,如果兩個URL對象解析爲相同的IP地址和端口,則它們是相等的,而不僅僅是它們具有相同的字符串。然而,布洛赫和普格指出了一個更嚴重的致命弱點:平等行爲根據您是否連接到網絡,虛擬地址可以解析爲同一主機,或者如果您不在網絡中而有所不同,解決方案是阻止操作。所以,據吸取的經驗教訓,他們建議:

請勿使用URL;使用URI代替。 URI不會嘗試比較地址或端口。另外,請勿將URL用作Set元素或Map鍵。
對於API設計者,equals()方法不應該依賴於環境。例如,在這種情況下,如果計算機連接到互聯網而不是獨立的,則平等不應改變。


從URI等於文檔:

兩年分層URI被視爲相等,其路徑必須相等和他們的查詢必須同時爲不確定或其他相等。

就你而言,兩條路徑是不同的。一個是「/」,另一個是「」。


根據該URI RFC第6.2.3節:

實現可以使用特定方案的規則,在進一步的處理 成本,以降低假陰性的概率。例如, 由於「http」方案使用授權組件,其默認端口爲「80」,並且定義的空路徑等效於 「/」,因此以下四個URI是等效的:

http://example.com 
http://example.com/ 
http://example.com:/ 
http://example.com:80/ 

看來這個實現不使用特定於方案的規則。


資源:

+3

...這不回答這個問題的。 – Zarel 2010-09-22 15:56:28

+0

有趣的..但是然後toURI()測試會成功,如果他們實際上是平等的。 – 2010-09-22 15:58:07

+0

@SB,用更多的RFC和更多文檔更新:) – 2010-09-22 16:24:43

2

嚴格地說他們 EQU人。 可選尾部斜線(/)只是一個常見用法,但不是必須的。你可以爲

http://www.yahoo.com/foo/ 

顯示不同的頁面和

http://www.yahoo.com/foo 

它甚至可能爲你提供我相信HTTP標頭可以跳過那條斜線的一個。

+0

對,但是有沒有可以改變www.yahoo.com和www.yahoo.com/的邏輯? – 2010-09-22 15:55:23

+7

'example.com/foo /'和'example.com/foo'是不同的,是的,但是'example.com'和'example.com /'完全一樣。 – Zarel 2010-09-22 15:57:31

0

您可以隨時比較相對URL與Path.equals方法

前。

Paths.get("/user/login").equals(Paths.get("/user/login/"))) 

農產品真正

您還可以使用startsWith /的endsWith的方法

+0

這是否會爲uri工作? – SAVVY 2017-08-25 23:04:24

+0

沒有類像路徑 – SAVVY 2017-08-26 10:54:38