代码之家  ›  专栏  ›  技术社区  ›  NG.

检查URL相等性的正确方法

  •  19
  • NG.  · 技术社区  · 14 年前

    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的一些基本信息?

    编辑

    3 回复  |  直到 14 年前
        1
  •  28
  •   Colin Hebert    14 年前

    摘自2007年JavaOne:

    第二个谜题,恰当地命名为“集合的更多乐趣”,让用户创建由一个或多个URL对象组成的HashMap键。同样,大多数观众都猜不出正确答案。

    观众在这里学到的重要一点是

    . URI不尝试比较地址或端口。另外,不要将URL用作Set元素或Map键。
    对于API设计器,equals()方法不应依赖于环境。例如,在这种情况下,如果一台计算机连接到Internet,与独立计算机相比,相等性不应改变。


    从URI equals文档:

    对于两个被视为相等的层次URI, 他们的道路必须相等 它们的查询要么都是未定义的,要么是相等的。


    根据URI RFC§6.2.3:

    启动位置 在进一步处理时使用特定于方案的规则 成本,以减少误报的概率。例如, 因为“http”方案使用了authority组件,所以具有

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

    这个实现似乎没有使用特定于方案的规则。


    资源:

        2
  •  2
  •   Wernight    14 年前

    严格地说是的 平等。这个 可选择的

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

    以及

    http://www.yahoo.com/foo
    

    甚至对于您提供的HTTP头也有可能跳过斜杠。

        3
  •  0
  •   BTalker    9 年前

    您可以随时将相对URL与路径.equals-方法

    前任。

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

    也可以使用startsWith/endsWith方法