Скобки в URL-адресе запроса являются законными, но не в URI (Java)?

По-видимому, скобки не разрешены в путях 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.

Как включить URL-адреса URL-адреса сервлета в URI?

Ответы

Ответ 1

Java URI выглядит очень строгим и требует экранирования для Исключена кодировка US-ASCII.

Чтобы исправить это, я кодирую те и только те символы минус '%' и '#', поскольку URL-адрес может уже содержать этот символ. Я использовал URI Utilities Http Clients, который по какой-то причине не находится в 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 (еще впереди):