2010-09-22 67 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