【发布时间】:2011-08-20 07:04:45
【问题描述】:
我需要为 URI 生成一个 href。除了需要百分比编码的保留字符之外,一切都很容易,例如指向/some/path;element 的链接应显示为<a href="/some/path%3Belement">(我知道path;element 表示单个实体)。
最初我正在寻找一个 Java 库来执行此操作,但最终我自己编写了一些东西(请查看下面的 Java 失败之处,因为这个问题不是 Java 特定的)。 p>
所以,RFC 3986 does suggest when NOT to encode。当我读到它时,当字符属于unreserved (ALPHA / DIGIT / "-" / "." / "_" / "~") 类时,这应该发生。到目前为止,一切都很好。但是相反的情况呢? RFC 只提到百分比 (%) 总是需要编码。但是其他人呢?
问题:假设所有不是未保留的内容都可以/应该进行百分比编码是否正确?例如,左括号( 不一定需要编码,但分号; 需要。如果我不对其进行编码,我最终会在关注<a href="/first;second"> 时寻找/first*。但是按照<a href="/first(second">,我总是最终寻找/first(second,正如预期的那样。让我感到困惑的是,就 RFC 而言,( 和 ; 都在同一个 sub-delims 类中。正如我想象的那样,对所有非保留的内容进行编码是一个安全的选择,但是在本地化 URI 方面,SEO 能力和用户友好性又如何呢?
现在,Java 库失败了。我试过这样做new java.net.URI("http", "site", "/pa;th", null).toASCIISTring()
但这给了http://site/pa;th,这是不好的。观察到类似的结果:
javax.ws.rs.core.UriBuilder-
Spring's UriUtils - 我已经尝试过
encodePath(String, String)和encodePathSegment(String, String)
[*] /first 是点击<a href="/first;second"> 时在服务器端调用HttpServletRequest.getServletPath() 的结果
编辑:我可能需要提一下,在 Tomcat 下观察到了这种行为,并且我检查了 Tomcat 6 和 7 的行为方式相同。
【问题讨论】:
标签: java language-agnostic rfc rfc3986