【问题标题】:Get the Raw Request String from HttpServletRequest从 HttpServletRequest 获取原始请求字符串
【发布时间】:2009-08-27 16:25:12
【问题描述】:

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

我需要获取请求的全文,在这种情况下它是一个 POST 请求,所以 URL 没有帮助。它也是多部分表单的一部分,所以我不能只调用“getParameterNames()”或“getParameterValues()”。

谢谢,

【问题讨论】:

  • 除了url之外,你还想知道关于请求的哪些事情
  • 我有一个自定义 JSF 组件。在它的“decode()”方法中,我需要找出选择了哪些元素。在除多部分以外的任何表单上,我只需调用“getParameterValues('myparam')”即可获取值(所选项目列表),但对于多部分表单,该方法不会返回任何内容.所以我需要手动解析原始数据以获取所选项目。我不能使用 servlet 过滤器,因为它只会影响我自己的自定义组件。
  • 原来我找到了另一种获取所需参数的方法。如果我使用 FacesContext.getExternalContext.getParameterValuesMap() ,无论表单类型如何,它都能满足我的需求。谢谢大家
  • answer。如有任何疑问,请随时询问。

标签: java jsf servlets


【解决方案1】:

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

ServletInputStream in = request.getInputStream();

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

希望对您有所帮助。

【讨论】:

  • 这将只读取 body,而不是 HTTP 请求的标头。
【解决方案2】:

嗯,听起来您正在进行某种故障排除。在查看原始表单数据时,为什么不直接删除多部分表单组件。可以使用下面的JSP sn -p 来构造表单数据。

<%
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);
%>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您想获取对字符串的整个请求,您可以使用 apache IOUtils 库通过一行代码来完成。

      String myString = org.apache.commons.io.IOUtils.toString(request.getInputStream());
      

      【讨论】:

      • 重复的答案,更适合作为对该答案的评论
      • @MarkJeronimus monchote 的回答不准确,它没有按照 Jaime 的要求将输入流转换为字符串
      【解决方案5】:

      听起来您需要servlet filter。没有标准的方法来处理multipart/form-data,因此当wrapping the HttpServletRequest 时,您必须注意适当地缓存这些数据。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多