Tomcat, JAX-RS, Джерси, @PathParam: как передать точки и косые черты? - программирование
Подтвердить что ты не робот

Tomcat, JAX-RS, Джерси, @PathParam: как передать точки и косые черты?

Имея такой метод:

@GET @Path("/name/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String getProperty(@PathParam("name") String name) {
        System.out.println(name);
}

Как передать значение типа "test./test"?

/name/test./test     gives HTTP 404
/name/test.%2Ftest   gives HTTP 400
/name/test.%252Ftest prints test%2Ftest

Но если я делаю name = URLDecoder.decode(name);, он печатает /test, а первая часть test. исчезает.

Есть один или два вопроса, как это уже, но они старые и не было найдено хорошего решения, я думал, что снова попрошу.

4b9b3361

Ответ 1

Образец в аннотации @Path внутренне превращается в регулярное выражение, при этом части шаблона соответствуют только выбранным символам по умолчанию. В частности, они обычно не соответствуют символам /; что почти всегда правильная вещь (как она позволяет вам ставить шаблоны частично через путь), но в этом случае это не так, как вы хотите потреблять весь последующий путь. Чтобы получить все, мы должны переопределить фрагмент регулярного выражения для этого конкретного шаблона; это на самом деле довольно просто, поскольку мы просто вставляем фрагмент шаблона :, за которым следует RE, который мы хотим использовать:

@GET @Produces(MediaType.TEXT_PLAIN)
@Path("/name/{name:.+}")
public String getProperty(@PathParam("name") String name) {
    return name;
}

Это будет соответствовать всем символам после /name/ (до, но не включая любую часть запроса ?), но будет соответствовать только если там что-то вообще. Имейте в виду, что, если у вас есть какие-либо другие вещи @Path("/name/..."), все может стать действительно запутанным! Так что не делайте этого.

Ответ 2

Если вы используете tomcat и хотите передать / в pathparam. кроме @Path("/name/{name:.+}"), как сказал "Donal Fellows", вы должны добавить -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true в свои аргументы jvm, см. также tomcat security-howto.

Ответ 3

Попробуйте указать тип кодировки, для меня это работает со /name/test.%252Ftest:

System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");

Ответ 4

Glassfish v4 принимает закодированный scape для косой черты% 2f. Затем мы можем передать закодированный тест String.% 2Ftest и получить результат test./test с использованием URLDecoder.decode(имя, "UTF-8" ). Я думаю, что это лучшее решение, особенно когда у вас много параметров по одному запросу. Использование пути @Path ( "/name/{name:. +}" ) - отличное решение, когда в запросе есть несколько параметров.

Использование% 252f усложняет запрос клиента, потому что необходимо сконфигурировать запрос String вручную. С помощью Glassfish v4 легко использовать процентное кодирование с помощью URLEncoder.encode в клиенте и URLDecoder.decode на сервере по желанию Strings. Наиболее программируемые языки имеют процент кодирования и декодирования, поэтому это идеальное решение.

Я попробовал включить закодированную косую черту в стеклянную фазу v3, но не успел, вот синтаксис, который я пробовал использовать

bin\asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled = true configs.config.server-config.network-config. protocols.protocol.http-слушатель-1.http.encoded-слэш-Enabled = True

Набор команд выполнен успешно.

Отношения Кассио Сеффрин