【问题标题】:Java Servlets: Differentiate between GET and POSTJava Servlet:区分 GET 和 POST
【发布时间】:2018-10-04 01:57:53
【问题描述】:

有没有一种可靠的方法可以使用HttpServletRequest 分别提取GETPOST 参数?

也就是说,将查询字符串中发送的参数 (GET) 与请求正文中发送的参数 (POST) 区分开来,假设为 Content-Type: application/x-www-form-urlencoded

示例

POST /path HTTP/1.1
Host: test.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

first_name=posted_foo&last_name=posted_bar

我希望得到两个变量,一个包含来自 URL 的值,另一个包含来自请求正文的值:

get = {"first_name": "foo", "last_name": "bar"}
post = {"first_name": "posted_foo", "last_name": "posted_bar"}

我似乎能够提取这些参数的唯一方法是 getParameter* 方法。

  • HttpServletRequest.getParameter:返回单个字符串,通常是 URL (GET) 中提供的值。
  • HttpServletRequest.getParameterValues:返回一个字符串数组,其中包含查询字符串和请求正文中提供的所有值。通过查询字符串传递的那些往往首先出现。但是,如果返回的字符串数组中只有一个值,则无法可靠地确定该值是来自查询字符串还是请求正文。

为了说明,使用 PHP,这些值是通过 $_GET$_POST 超全局变量提供的。

【问题讨论】:

标签: java http servlets jakarta-ee


【解决方案1】:

查询字符串很容易解析,因此为您提供了 URI 查询参数名称,而 getParameterNames() 为您提供了整个集合。

用“&”分割查询字符串,然后用“=”分割每个标记。 对于每个键和值,执行 URLDecoder.decode()。就是这样。

把所有这样的钥匙扔进一组。如果参数在 uri 查询中,则很有可能它只在那里。如果你一定要查它是否也在帖子中,实际上,帖子表单编码的数据也是这样编码的,但是那个帖子被消费了,所以为时已晚。此外,帖子也可以是非平凡解码的多部分编码。

最后,你需要这种区别是很奇怪的。您能解释一下您寻求这种区别的目的是什么?

【讨论】:

  • 感谢您的回答。我确实知道我可以手动解析查询字符串以检索 GET 参数,但我认为也许有一种更可靠的方法来区分我所缺少的两者。我想答案差不多:不是不自己解析。
  • 我问的原因不是我需要它,我知道我可以很容易地依赖getParameter等。只是我想看看是否这是可能的。主要来自 PHP 背景,这种区别很容易获得。我实际上打算编写一个围绕HttpServletRequest 的类,它的功能类似于Symfony 的HTTP Foundation Request 类,这就是提出这个问题的原因。再次感谢!
  • 我遇到的一个原因是安全性。例如,虽然 OAuth 2.0 规范允许将不记名令牌作为查询参数传递,但这并不总是安全的。如果访问令牌出现在正文中,我可能想接受它,但如果在查询字符串中则拒绝。不过,正如@user2023577 所说,这种情况非常罕见。
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多