从HttpServletRequest获取原始请求字符串

18

从HttpServletRequest对象中获取原始的HTTP请求是否可能?如果可能,我希望将原始请求作为字符串查看。

我需要获取请求的完整文本,此处为POST请求,因此URL无法帮助。它还是多部分表单的一部分,因此我不能只调用"getParameterNames()"或"getParameterValues()"。

谢谢。


除了URL之外,您还想了解有关请求的哪些内容? - Arun P Johny
我有一个自定义的JSF组件。在它的“decode()”方法内部,我需要找出哪些元素被选中了。在除了多部分之外的任何表单上,我可以调用“getParameterValues('myparam')”并获取值(所选项目列表),但是对于多部分表单,该方法不返回任何内容。因此,我需要手动解析原始数据以获取所选项目。我无法使用servlet过滤器,因为它只影响我的自定义组件。 - Jaime Garcia
1
事实证明,我找到了另一种获取所需参数的方法。如果我使用FacesContext.getExternalContext().getParameterValuesMap(),无论表单类型如何,都可以得到我需要的内容。感谢大家。 - Jaime Garcia
请查看此答案。如有任何疑问,请随时提出。 - Vikash Kumar Verma
5个回答

11

你可以通过以下方式读取原始的 HTTP 请求:

ServletInputStream in = request.getInputStream();

然后使用InputStream的常规read方法。

希望能有所帮助。


3
这将仅读取HTTP请求的主体,而不是头部。 - slartidan

4

听起来你在进行一些故障排除。为什么不在查看原始表单数据时放弃多部分表单组件呢?您可以使用以下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);
%>

1

或者,如果您可以编写一些拦截器将参数名称和值转换为字符串格式对象,并将其设置在请求上下文中,过滤器也是一个不错的选择。


0
如果您想将整个请求转换为字符串,可以使用一行代码使用Apache IOUtils库完成。
String myString = org.apache.commons.io.IOUtils.toString(request.getInputStream());

重复的答案,更适合作为对那个答案的评论。 - Mark Jeronimus
@MarkJeronimus的回答不准确,它没有像Jaime所要求的那样将输入流转换为字符串。 - PbxMan
首先,它没有回答问题。使用此方法,您将获得与@monchote 2010年的答案相同的结果-仅正文,没有标题,没有任何其他内容。问题是关于原始文本表示。其次,此IOUtils.toString(is)调用已在2.5版本中弃用。 - Václav

0

3
注意:此答案已不准确。Servlet 3.0(JEE6)引入了对multipart/form-data的支持。http://download.oracle.com/javaee/6/api/javax/servlet/annotation/MultipartConfig.html - McDowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接