Вопрос по jersey, slash, rest, jax-rs – Tomcat, JAX-RS, Джерси, @PathParam: как передать точки и косые черты?

15

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

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

Как передать значение, подобное & quot; 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. исчезает.

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

Ваш Ответ

4   ответа
5

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

Мне это не нужно, если путь действительно содержит/, а не закодированный.
0

/name/test.%252Ftest:

System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");
Работает! Добавлена кодировка, и получается «тест».% 252Ftest & quot; to "test./test" ;, а не просто" / test ". Спасибо! Maxim Suponya
1

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

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

Я попытался включить закодированный слеш в Glassfish 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 = правда

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

С уважением Кассио Сеффрин

21

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

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

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

Выглядит хорошо, но похоже, что обратные слеши не соответствуют этому регулярному выражению ..
@ Максим Я думаю, что это стандарт, и я использую его с Apache CXF.
Работает! Может проходить любое количество слешей, все отлично захватывается. Будет ли это работать со всеми реализациями JAX-RS или как работает джерси? В любом случае, большое спасибо, это решило мою проблему. Maxim Suponya

Похожие вопросы