只获取POST参数 (Java)

12

有没有办法从HttpServletRequest对象中获取仅POST参数?

例如,PHP具有$ _POST超全局变量,而Perl的CGI.pm仅在HTTP方法为POST(默认情况下)时检索POST参数。

HttpServletRequest.getParameter(String)将包括 GET URL参数,即使HTTP方法是POST也是如此。


2
据我理解,您只想获取POST请求体中的参数,而不是从POST URL中获取参数。 - McDowell
没错,那是一个更准确的描述。 - dankuck
6个回答

7
据我了解,HTTP中没有所谓的POST参数和GET参数,只有POST和GET方法。当使用POST方法发出请求时,参数位于消息正文中。对于GET请求,参数位于URL中。
我的第一反应是这可能是您的servlet容器实现上的错误。但是,由于事情并不总是如您所期望的那样,Java Servlet规范(至少2.4版本)不区分这两种类型的参数。因此,无法使用servlet API获取POST或URL参数。
当然,您已经有了备选方案。但是,以防万一,我提供了两个我想到的替代方案:
  1. 如果你可以访问参数名称定义,当你遍历getParameterNames()结果时,你可以使用前缀来区分它们两个。

  2. 你可以解析URL创建一个URL对象,并使用getQuery()方法仅获取参数。然后,使用一些实用程序类(例如ParameterParserHttpClient库中)来解析查询字符串上的参数。最后,从getParameterNames()结果中减去这些名称。


嗯...我只是在测试一个实现(Win32的Tomcat)。你测试过其他的吗? - dankuck
1
ParameterParser听起来像是识别URL参数和值的完美包。那么可以使用类似于ykaganovich答案中的机制。 - dankuck

6
我猜可能的方法是手动解析HttpServletRequest.getQueryString()并检查其中是否存在参数。
一个天真的实现方式(忽略url转义的键值)大概是这样的(未经过测试):
public boolean isInQuery(HttpServletRequest request, String key) {
  String query = request.getQueryString();
  String[] nameValuePairs = query.split("&");
  for(String nameValuePair: nameValuePairs) {
    if(nameValuePair.startsWith(key + "=")) {
      return true;
    }
  }
  return false;
}

1
这是一个非常简单的解决方案。不过,这听起来像是一种变通方法。我想知道是否有一些标准类可以完成这项工作。对于读者,在该方法的开头添加以下行: key = URLEncoder.encode(key, "UTF-8"); - dankuck
啊,我猜“workaround”这个词不太合适。只是感觉不对,因为我知道有一些非常相似的代码隐藏在那里。 - dankuck
1
df在Apache的HttpClient类中提到了一个叫做ParameterParser的类。虽然它不在Java标准库中,但至少它考虑到了我们可能会忘记的所有小细节。然后代码可以通过getParameterValues()进行处理,并忽略ParameterParser.parse()给出的任何值。 - dankuck
@ViktorBrešan 是的,这就是为什么它可以用来解决OP的问题。你有什么观点? - ykaganovich
@ykaganovich 抱歉,是我的错误。 - Viktor Brešan
当一个参数同时存在于查询参数和POST参数中时,该方法将无法检测到POST参数中还有一个参数。 - Jimmy T.

3

您能否在HttpServlet子类的doPostdoGet中从HttpServletRequest获取参数?

使用getParameter获取的任何内容都是POST,在doGet方法中获取的任何内容都是GET。


我正在尝试忽略通过URL传递的参数。无论使用哪种HTTP方法,这些参数都是由getParameter包含的。 - dankuck
1
Post请求可以同时具有GET和POST参数。如果只有GET参数(比如“nickname”),那么在doPost方法中调用request.getParameter("nickname"),你会得到“nickname” GET参数的值,但根据你的解释,它应该是null。 - Jamol

2
我认为您可以使用HttpServletRequest接口中提供的getMethod()方法来做些什么。
Java文档1.6:Java doc 1.6 这也适用于1.4和1.5版本。

这并不会告诉你关于参数来源的任何信息。它只会告诉你请求中使用了哪种HTTP方法。 - Yinzara

1

这个问题在相关帖子中得到了解答:

Normaly you can GET and POST parameters in a servlet the same way:

request.getParameter("cmd");

But only if the POST data is encoded as key-value pairs of content type: "application/x-www-form-urlencoded" like when you use a standard HTML form.


1

我不确定这是否可行,但您可以尝试使用request.getReader()提取POST正文的原始内容。容器可能会在将控制权交给您的应用程序之前删除该数据,即使它没有这样做,您也必须自己解码参数字符串。


有趣的是,我更倾向于使用上面建议的迂回方法,因为POST数据有两种不同的常见格式(以及任意数量的其他格式)。 - dankuck

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