簡體   English   中英

檢查URL相等性的正確方法

[英]Proper way to check for URL equality

我有以下場景:

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檢查。 說空路徑== /?是否合理? 我希望沒有這種代碼

從2007 JavaOne:

第二個謎題,恰如其分地標題為“更多集合的歡樂”,用戶可以創建包含多個URL對象的HashMap鍵。 同樣,大多數觀眾都無法猜出正確的答案。

觀眾在這里學到的重要一點是, URL對象的equals()方法實際上已被破壞 在這種情況下,如果兩個URL對象解析為相同的IP地址和端口,則它們是相等的,而不僅僅是它們具有相同的字符串。 然而,Bloch和Pugh指出了一個更加嚴重的致命弱點:平等行為根據你是否連接到網絡,虛擬地址可以解析到同一主機,或者如果你不在網上,解決方案是阻塞操作。 因此,就經驗教訓而言,他們建議:

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


從URI等於文檔:

要使兩個分層URI相等, 它們的路徑必須相等,並且它們的查詢必須都是未定義的,否則必須相等。

在您的情況下,兩條路徑是不同的。 一個是“/”,另一個是“”。


根據URIRFC§6.2.3:

實現可以以進一步的處理成本使用特定於方案的規則,以降低漏報的可能性。 例如,因為“http”方案使用權限組件,默認端口為“80”,並且定義了一個等同於“/”的空路徑,所以以下四個URI是等效的:

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

似乎此實現不使用特定於方案的規則。


資源:

嚴格說來,他們是相等的。 可選的尾部斜杠(/)僅是常見用法,但不是必須的。 您可以顯示不同的頁面

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

並為

http://www.yahoo.com/foo

你提供的那個甚至可能我認為HTTP標頭可以跳過那個斜杠。

您始終可以使用Path.equals方法比較相對URL

恩。

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

產生真實

您還可以使用startsWith / endsWith-methods

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM