在请求URL括号是合法的,但不是在一个URI(Java)的?(Brackets in a Reque

2019-09-18 02:49发布

显然,括号不URI路径允许的。

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

换一种说法

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

顺便说一句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?

Answer 1:

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职位(更多的惊喜)相关:

  • 哪些字符组成一个网址无效?


文章来源: Brackets in a Request URL are legal but not in a URI (Java)?