请求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帖子(更多):
上一篇: Brackets in a Request URL are legal but not in a URI (Java)?