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?
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帖子(更多内容):