2009-08-27 128 views
14

是否可以从HttpServletRequest对象获取原始HTTP请求?我想尽可能将原始请求视为字符串。从HttpServletRequest获取原始请求字符串

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

谢谢

+0

你想知道的关于url以外的请求的事情 – 2009-08-27 16:45:17

+0

我有一个自定义的JSF组件。它的内部是“decode()”方法,我需要找出哪些元素被选中。在除了多部分以外的表单上,我可以调用“getParameterValues('myparam')”,并且我可以获取值(所选项目的列表),但是使用多部分表单,该方法不会返回任何内容。所以我需要手动解析原始数据来获取选定的项目。我不能使用servlet过滤器,因为它只影响我自己的自定义组件。 – 2009-08-27 17:22:22

+1

原来我找到了另一种获取我需要的参数的方法。如果我使用FacesContext.getExternalContext.getParameterValuesMap(),无论表单类型如何,都可以提供我所需的内容。感谢所有 – 2009-08-27 18:33:39

回答

0

听起来像是你需要一个servlet filter。没有标准的方法来处理multipart/form-data,所以当wrapping the HttpServletRequest时,你必须小心地缓存这些数据。

+3

注意:这个答复不再准确。 Servlet 3.0(JEE6)引入了对'multipart/form-data'的支持。 http://download.oracle.com/javaee/6/api/javax/servlet/annotation/MultipartConfig.html – McDowell 2010-09-04 13:52:39

1

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

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

您可以通过执行读取原始的HTTP请求:

ServletInputStream in = request.getInputStream(); 

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

希望有所帮助。

1

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

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