6

どうやら 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ダブルがエスケープされます。

サーブレット リクエスト URL を URI に変換するにはどうすればよいですか?

4

1 に答える 1

6

Java の URI は非常に厳密なようで、Excluded US-ASCII Charsetのエスケープが必要です。

これを修正するために、URL に既にこれらの文字が含まれている可能性があるため、これらの文字から'%'andを除いた文字のみをエンコードします。'#'何らかの理由で HttpComponents にない Http Clients URI utils を使用しました。

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 に答える