2012-03-21 8 views
1

По-видимому, порядок параметров запроса не сохраняется в контейнере сервлетов Tomcat (на каждый google кажется, что другие контейнеры имеют одну и ту же проблему).Запрос порядка параметров в контейнерах сервлетов

Это кажется очень неправильным.

Как восстановить фактический порядок параметров запроса из HttpServletRequest?

EDIT Кстати для тех, которые думают, что порядок параметров запроса не имеет значения, есть разница между:

http://blah?a=1&a=2 

и

http://blah?a=2&a=1 

Так порядок имеет значение для повторяющихся параметров запроса (к счастью, Java справляется с этим правом).

+2

Зачем вам нужен порядок параметров? вы можете получить доступ ко всем, используя свое имя –

+0

Поскольку порядок параметров можно использовать для указания порядка списка, то есть отсортированного/связанногоhashmap. Я уверен, что вам понадобился сортированный кортеж один раз? Я не хотел полагаться на имя, изменяющее параметры запроса, чтобы делать заказ. –

+0

Во-вторых, я полагаю, что полагаться на что-либо от клиента - это плохая идея; есть слишком много способов, которые могут пойти не так. –

ответ

3

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

  • использование request.getQueryString() увидеть GET параметры
  • получить сырье запроса (request.getInputStream()) и прочитать представленные POST Params.
+0

Я попробовал запрос.getInputStream(), и это не сработало (какой-то фильтр вверх по потоку, должно быть, съел товар). Я полагался на запрос, потому что был ленив, и я был потрясен, узнав об этом. –

+0

Он не должен быть фильтром - сам процессор сервлета потребляет входной поток, когда он анализирует параметры POST, как только вы вызываете 'getParameter()' et.al. Хотя бы один раз. Ссылаясь на [servlet api doc] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter (java.lang.String)): _ Если данные параметров были отправлены в тело запроса, например, происходит с запросом HTTP POST, а затем считывание тела напрямую через getInputStream() или getReader() может помешать выполнению этого метода. –

0

Возможно, вы можете использовать getRequestURL: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getRequestURL() и оттуда разобрать параметры.

НО, в ответ на ваш комментарий «Это кажется очень неправильным». Я думаю, вы должны пересмотреть свою позицию.

Порядок ваших параметров просто не имеет смысла. Скажем, например - вы просили список автомобилей по параметрам. Не имеет значения, просите ли вы список бродов, которые являются зелеными, или список зеленых автомобилей, которые являются бродами.

+0

Нет, но позволяет сказать, что я делал список TODO, который я хотел обновить все сразу (я не делаю этого BTW). Каждое имя параметра может быть идентификатором записи. Значение будет описанием. ПОРЯДОК параметров будет приоритетом. Я не говорю, что он прочен ... Я просто ожидал этого для быстрого взлома, и в первый раз я узнал об этом. –

Смежные вопросы