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

Ada*_*ent 6 java url uri servlets

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

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

换一种说法

request.getRequestURL() == "http://localhost:8080/a]b"
request.getRequestURI() == "/a]b"
Run Code Online (Sandbox Code Playgroud)

BTW getRequestURL()和URI通常是转义即为 http://localhost:8080/a b

request.getRequestURL() == "http://localhost:8080/a%20b"
Run Code Online (Sandbox Code Playgroud)

所以,如果你尝试这样做:

new URI("http://localhost:8080/a]b")
new URI(request.getRequestURL())
Run Code Online (Sandbox Code Playgroud)

它会因URI解析异常而失败.如果我逃脱将使%20双重逃脱的路径.

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

Ada*_*ent 5

Java的URI似乎非常严格,需要转义为Excluded US-ASCII Charset.

为了解决这个问题,我对这些进行了编码,并且只对那些字符进行编码'%','#'因为URL可能已包含这些字符 我使用了Http Clients 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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:以下是一些相关的SO帖子(更多内容):

  • RFC3986已废弃RFC2396.现在允许使用方括号,但仅限于分隔IPv6地址."由Internet协议文字地址,版本6 [RFC3513]或更高版本标识的主机通过将IP文字括在方括号("["和"]")中来区分.这是唯一允许使用方括号字符的地方在URI语法中." http://www.rfc-editor.org/rfc/rfc3986.txt (3认同)
  • `java.net.URL`刚破了. (2认同)