请求URL中的括号是合法的,但不在URI(Java)中?

显然,在URI路径中不允许使用括号。

我不确定这是否是一个Tomcat问题,但我得到的请求包含路径]

换一种说法

request.getRequestURL() == "http://localhost:8080/a]b"
request.getRequestURI() == "/a]b"

BTW getRequestURL()和URI通常会被转义,例如http://localhost:8080/ab

request.getRequestURL() == "http://localhost:8080/a%20b"

所以如果你尝试做:

new URI("http://localhost:8080/a]b")
new URI(request.getRequestURL())

它将失败,并出现URI解析异常。 如果我逃离了将使%20双重逃跑的道路。

如何将Servlet请求URL转换为URI?


Java的URI看起来非常严格,需要转义排除的US-ASCII字符集。

为了解决这个问题,我编码这些字符,只有那些减去'%''#'的字符,因为URL可能已经包含这些字符。 我使用Http客户端URI utils,由于某些原因,它不在HttpComponents中。

private static BitSet badUriChars = new BitSet(256);
static {
    badUriChars.set(0, 255, true);
    badUriChars.andNot(org.apache.commons.httpclient.URI.unwise);
    badUriChars.andNot(org.apache.commons.httpclient.URI.space);
    badUriChars.andNot(org.apache.commons.httpclient.URI.control);
    badUriChars.set('<', false);
    badUriChars.set('>', false);
    badUriChars.set('"', false);
}

public static URI toURIorFail(String url) throws URISyntaxException {
    URI uri = URIUtil.encode(url, badUriChars, "UTF-8");
    return new URI(uri);
}

编辑:这里有一些相关的SO帖子(更多):

  • 哪些字符使网址无效?
  • 链接地址: http://www.djcxy.com/p/70211.html

    上一篇: Brackets in a Request URL are legal but not in a URI (Java)?

    下一篇: What is the difference between <section> and <div>?