有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

换句话说

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

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


共 (1) 个答案

  1. # 1 楼答案

    Java的URI看起来非常严格,需要对Excluded US-ASCII Charset进行转义

    为了解决这个问题,我对这些字符进行编码,并且只对那些字符进行编码,减去'%''#',因为URL可能已经包含这些字符。我使用了Http客户端URI UTIL,由于某些原因,它不在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帖子(更多内容):