Получить параметры формы из многочастного запроса без получения файлов - PullRequest
3 голосов
/ 17 ноября 2009

Я ищу способ получения параметров формы HTTP-запроса из нескольких частей в Servlet-фильтре без загрузки файлов (пока).

request.getParameterMap () возвращает пустое значение. Я понимаю, что это из-за того, что запрос состоит из нескольких частей.

Я посмотрел на commons.HttpFileUpload, но, похоже, это излишне для моей ситуации. В этом фильтре меня интересуют только нормальные параметры, и я пока не хочу обрабатывать загрузку файла.

Редактировать: главная проблема в том, что мне нужно иметь неповрежденный объект HttpRequestObject дальше по стеку фильтров Кажется, что HttpFileUpload использует часть данных запроса (возможно, используя объект потока данных и закрывая его снова.)

Ответы [ 4 ]

6 голосов
/ 17 ноября 2009

Это, конечно, не перебор, это правильный путь и всегда лучше, чем писать сам парсер. Apache Commons FileUpload разрабатывался и обслуживался годами и доказал свою надежность в обработке запросов из нескольких частей / данных формы. Вы не хотите изобретать велосипед. Если вы действительно хотите это сделать (я не рекомендую это), прочитайте multipart / form-data спецификацию и начните с чтения HttpServletRequest#getInputStream() (предупреждение: это смесь двоичного и символьные данные!).

При необходимости вы также можете написать Фильтр, который использует Apache Commons FileUpload и проверяет каждый запрос, является ли он multipart / form-data, и, если это так, затем возвращает параметры в карту параметров запроса с помощью Объединяет FileUpload и помещает загруженные файлы (или исключения) в качестве атрибутов запроса, чтобы в конечном итоге это стало немного более прозрачным в вашем коде сервлета. Вы можете найти здесь базовый пример, чтобы получить идею.

Надеюсь, это поможет.

4 голосов
/ 14 октября 2011

Просто чтобы добавить к уже предоставленным ответам - у меня была очень похожая проблема в том, что я пытался добавить некоторую проверку CSRF в наше существующее веб-приложение. Мы решили включить в каждую форму специальный токен с использованием некоторого JS и добавить фильтр сервлетов, чтобы проверить, существует ли токен (следовательно, универсальное изолированное решение).

Сервлет будет проверять наличие токена, но он будет поврежден для каждой формы, которая предоставляет возможность загрузки файла. Поэтому я часто заходил на эту страницу, пока занимался поиском.

Обходной путь, который мы использовали (пытаясь избежать каких-либо действий с загруженными файлами), заключался в том, чтобы заставить JavaScript добавить маркер в качестве параметра GET, т. Е. Мы изменили URL-адрес действия формы, добавив токен, и поэтому могли использовать Метод HttpServletRequest.getParameter () для токена (и только токена).

Я проверил это в IE, FF и Chrome, и все, кажется, счастливы.

Надеюсь, это поможет любому, кто также окажется в подобной ситуации.

4 голосов
/ 17 ноября 2009

На сайте Oreilly Servlets есть пример кода, который вы можете скачать, настроить и использовать. Это включает MultipartRequest , который звучит так, как будто он выполняет то, что вам нужно, он снимает многокомпонентный запрос и предоставляет доступ к параметрам и файлам отдельно.

0 голосов
/ 26 июня 2013

Commons FileUpload предоставляет механизм для чтения параметров запроса из многочастной загрузки формы.

Вот действительно хороший пример того, как получить параметры запроса:

Как загрузить файлы на сервер с помощью JSP / Servlet?

...