Получить только параметры POST (Java)

кто-нибудь знает способ получить только параметры POST из объекта HttpServletRequest?

IE, PHP имеет $ _POST superglobal и CGI Perl.pm будет извлекать параметры POST только в том случае, если HTTP-метод POST (по умолчанию).

HttpServletRequest.getParameter (строка) будет включать GET параметры URL, даже если метод HTTP POST.

6 ответов


Я думаю, один из способов может быть вручную проанализировать HttpServletRequest.getQueryString() и убедитесь, что в нем нет параметра.

наивная реализация (игнорирование url-экранированных значений ключа) будет выглядеть примерно так (непроверено):

public boolean isInQuery(HttpServletRequest request, String key) {
  String query = request.getQueryString();
  String[] nameValuePairs = query.split("&");
  for(String nameValuePair: nameValuePairs) {
    if(nameValuePair.startsWith(key + "=")) {
      return true;
    }
  }
  return false;
}

из моего понимания, нет таких вещей, как параметры POST и GET параметры в HTTP, есть методы POST и GET. Когда запрос выполняется с помощью метода POST, параметры входят в тело сообщения. В случае запроса GET параметры переходят в URL-адрес.

моей первой мыслью было, что это ошибка реализации в вашем контейнере сервлетов. Но, поскольку все не всегда так, как вы ожидаете, спецификация сервлета java (по крайней мере, версия 2.4) не различает между двумя типами параметров. Таким образом, нет способа получить параметры post или url с помощью API сервлета.

конечно, у вас уже есть план B. Но, на всякий случай, я публикую две альтернативы, которые пришли мне на ум:

  1. Если у вас есть доступ к определению имени параметра, вы можете использовать префикс для различения между ними при итерации результата getParameterNames ().

  2. вы можете проанализировать URL-адрес, создав URL-адрес объект и использование метода getQuery () для получения только параметров. Затем проанализируйте параметры строки запроса с помощью некоторого служебного класса, такого как ParameterParser на С помощью HttpClient библиотека. И, наконец, вычтите эти имена из результата getParameterNames ().


не могли бы вы просто получить параметры из HttpServletRequest в doPost или doGet в подклассе HttpServlet?

все, что вы захватите (через getParemeter) внутри doPost-это сообщение, и все, что внутри doGet-это GET.


Я думаю, вы могли бы что-то сделать с getMethod (), доступным из интерфейса HttpServletRequest.

Java doc 1.6

Это также доступно в 1.4 и 1.5.


Я не уверен, что это сработает, но вы можете попробовать извлечь сырое содержимое тела POST с помощью request.getReader(). Контейнер может удалить эти данные перед передачей управления вашему приложению, и даже если это не так, вам придется декодировать строку параметров самостоятельно.


на вопрос был дан ответ в это связано в должности:

Normaly вы можете получить и опубликовать параметры в сервлете таким же образом:

request.getParameter("cmd");

но только если данные POST кодируются как пары ключ-значение содержимого тип: "application / x-www-form-urlencoded" как при использовании стандартных HTML-форма.