Получите необработанную строку запроса из HttpServletRequest

Можно ли получить необработанный HTTP-запрос из объекта HttpServletRequest? Я хочу видеть необработанный запрос в виде строки, если это вообще возможно.

Мне нужно получить полный текст запроса, в данном случае это POST-запрос, поэтому URL-адрес не помогает. Это также часть формы, состоящей из нескольких частей, поэтому я не могу просто вызвать «getParameterNames()» или «getParameterValues()».

Спасибо,


person Jaime Garcia    schedule 27.08.2009    source источник
comment
Что вы хотите знать о запросе, кроме URL?   -  person Arun P Johny    schedule 27.08.2009
comment
У меня есть собственный компонент JSF. Внутри его метода decode() мне нужно узнать, какие элементы были выбраны. В форме, отличной от составной, я могу просто вызвать getParameterValues('myparam') и получить значения (список выбранных элементов), но с многочастной формой этот метод ничего не возвращает. Поэтому мне нужно вручную проанализировать необработанные данные, чтобы получить выбранные элементы. Я не могу использовать фильтр сервлета, потому что он влияет только на мой собственный пользовательский компонент.   -  person Jaime Garcia    schedule 27.08.2009
comment
Оказывается, я нашел другой способ получить нужные мне параметры. Если я использую FacesContext.getExternalContext.getParameterValuesMap(), это дает мне то, что мне нужно, независимо от типа формы. Спасибо всем   -  person Jaime Garcia    schedule 27.08.2009
comment
См. этот ответ. В случае возникновения каких-либо вопросов, не стесняйтесь спрашивать.   -  person Vikash Kumar Verma    schedule 29.04.2016


Ответы (5)


Похоже, вам нужен фильтр сервлетов. Не существует стандартного способа обработки multipart/form-data, поэтому вам придется позаботиться о надлежащем кэшировании этих данных, когда оборачивает HttpServletRequest.

person McDowell    schedule 27.08.2009
comment
Примечание: этот ответ больше не является точным. В Servlet 3.0 (JEE6) появилась поддержка multipart/form-data. download.oracle.com/javaee/6/api/ javax/сервлет/аннотация/ - person McDowell; 04.09.2010

Вы можете прочитать необработанный HTTP-запрос, выполнив:

ServletInputStream in = request.getInputStream();

а затем используйте обычные readметоды InputStream.

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

person monchote    schedule 11.03.2010
comment
Это будет читать только body, а не заголовки HTTP-запроса. - person slartidan; 05.03.2019

Ну, похоже, вы занимаетесь устранением неполадок. Почему бы просто не удалить компонент формы, состоящий из нескольких частей, пока вы просматриваете необработанные данные формы. Вы можете использовать следующий фрагмент JSP для создания данных формы.

<%
Enumeration en = request.getParameterNames();
String str = "";
while(en.hasMoreElements()){
   String paramName = (String)en.nextElement();
   String paramValue = request.getParameter(paramName);
   str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue);
}
if (str.length()>0)
   str = str.substring(1);
%>
person Chris J    schedule 28.08.2009

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

person Puran    schedule 27.08.2009

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

String myString = org.apache.commons.io.IOUtils.toString(request.getInputStream());
person PbxMan    schedule 02.12.2016
comment
Дублирующий ответ, лучше подходящий в качестве комментария к этому ответу - person Mark Jeronimus; 06.06.2019
comment
Ответ @MarkJeronimus monchote не точен, он не преобразует входной поток в строку, как того требует Хайме. - person PbxMan; 07.06.2019