6

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

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

换句话说

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

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

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

因此,如果您尝试这样做:

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

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

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

4

1 回答 1

6

Java 的 URI 似乎非常严格,需要对Excluded US-ASCII Charset进行转义。

为了解决这个问题,我只对那些减去'%'and的字符进行编码,'#'因为 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);
}

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

于 2012-06-14T19:47:40.787 回答