【问题标题】:Retrieve POST parameters only (Java)仅检索 POST 参数 (Java)
【发布时间】:2010-11-14 22:13:46
【问题描述】:

有谁知道从 HttpServletRequest 对象仅获取 POST 参数的方法?

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

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

【问题讨论】:

  • 据我了解,您只需要 POST 正文中的参数,而不需要 POST URL 中的参数。
  • 没错。这是一个更准确的描述。

标签: java post servlets


【解决方案1】:

据我了解,HTTP中没有POST参数和GET参数之类的东西,有POST和GET方法。当使用 POST 方法发出请求时,参数进入消息正文。在 GET 请求的情况下,参数进入 URL。

我的第一个想法是,这是您的 servlet 容器中的一个实现错误。但是,由于事情并不总是如您所愿,java servlet 规范(至少是 2.4 版本)并没有区分这两种参数。因此,无法使用 servlet API 获取 post 或 url 参数。

您当然已经有了 B 计划。但是,以防万一,我发布了两个我想到的替代方案:

  1. 如果您有权访问参数名称定义,则可以在迭代 getParameterNames() 结果时使用前缀来区分两者。

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

【讨论】:

  • 嗯...我只是在测试一种实现(用于 Win32 的 Tomcat)。你测试过其他人吗?
  • ParameterParser 听起来像是识别 URL 参数和值任务的完美包。然后可以使用类似于 ykaganovich 答案中的机制。
【解决方案2】:

我想一种方法可能是手动解析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;
}

【讨论】:

  • 这是一个非常简单的解决方案。不过,这听起来像是一种解决方法。我想知道是否有一些标准课程可以完成这项工作。对于读者,在方法的开头添加这一行:key = URLEncoder.encode(key, "UTF-8");
  • 啊,我猜“解决方法”是错误的词。只是感觉不对,因为我知道那里的某处隐藏着一些非常相似的代码。
  • df 在 Apache 的 HttpClient 类中提到了一个名为 ParameterParser 的类。它不在 Java 的标准库中,但至少它想到了我们可能在这里忘记的所有小东西。然后代码可以通过 getParameterValues() 并忽略任何具有 ParameterParser.parse() 给出的值之一。
  • @ViktorBrešan 是的,这就是为什么这可以用来解决 OP 的问题。你的意思是什么?
  • @ykaganovich 对不起,我的错误。
【解决方案3】:

您不能只从doPostdoGet 中的HttpServlet 子类中的HttpServletRequest 获取参数吗?

您在 doPost 中抓取(通过getParemeter)的任何内容都是 POST,而 doGet 中的任何内容都是 GET。

【讨论】:

  • 我试图忽略在 URL 中传递的参数。无论使用哪种 HTTP 方法,这些都包含在 getParameter 中。
  • 发布请求可以有 GET 和 POST 参数。如果只存在 GET 参数(比如“昵称”),那么如果您在 doPost 中执行 request.getParameter("nickname"),您将获得“昵称”GET 参数,根据您的解释,该参数应该为空。
【解决方案4】:

我认为您可以使用 HttpServletRequest 接口提供的 getMethod() 来做一些事情。

Java doc 1.6

这在 1.4 和 1.5 中也可用。

【讨论】:

  • 这不会告诉您有关参数来源的任何信息。它只会告诉您请求中使用了哪种 HTTP 方法。
【解决方案5】:

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

【讨论】:

  • 有趣的是,我更倾向于使用上面建议的迂回思路,因为 POST 数据有两种不同的常见格式(以及任何数量的其他格式)。
【解决方案6】:

问题已在this related post回答:

通常您可以在 servlet 中以相同的方式获取和发布参数:

request.getParameter("cmd");

但仅当 POST 数据被编码为内容的键值对时 类型:"application/x-www-form-urlencoded" 就像您使用标准时一样 HTML 表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2013-07-19
    • 2015-10-14
    相关资源
    最近更新 更多