Java servlet:request.getParameter()从POST请求的查询字符串中返回参数

4
我目前正在开发一个在Glassfish 4下运行的Servlet。 我实现了doPost()方法,并且需要确保参数是通过POST请求体传递的,而不是查询字符串。 我编写了一个测试实现来检查它:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getParameter("name");

    response.getOutputStream().print(name);
}

如果我使用以下URL以POST方式调用我的页面:
http://localhost:8080/myservlet/testservlet

当我将name=Nico作为post请求的主体传入时,返回值Nico是正确的。

如果我以以下方式调用它:

http://localhost:8080/myservlet/testservlet?name=Robert

当我在POST正文中传递name=Nico时,返回的是Robert,而name=Nico被忽略了。

我只是想避免在URL中传递参数。
有没有一种方式可以明确地从POST正文中检索参数,而不是从正文和查询字符串中检索?


你为什么要在接收端这样做?如果你想避免参数通过 URL 传递,那么当 doPost 运行时,已经太晚了。 - user253751
@immibis:感谢您的评论,但我不确定是否理解。我在Servlet开发方面还很新,对工作流程不是很了解。您的意思是我可以在实现此操作之前拦截请求吗? - Nico
只有一个参数'name',所以你不能。 - iamct
@Nico,我刚才说的并不是特定于servlet的事情。但是为了打个比方,假设我在拥挤的房间里对你大喊:“嘿,Nico,我的密码是PASSWORD42”。回应“我没听到因为你刚告诉所有人你的密码”是没有任何作用的。 - user253751
4个回答

2

在大多数情况下,您可以使用getParameterValues同时读取两者,第一个是查询字符串,第二个是POST请求体。现在您可以决定使用哪一个。
String[] lines = request.getParameterValues("name");


在最常见的情况下,这是正确的。也有可能通过getParameterValues()返回多于2个字符串。当表单包含数组名称时,就会出现这种情况。比如说,在一个表单中有2个名为"settings[]"的元素。通过调用getParameterValues("settings[]"),则返回4个元素:来自查询字符串的2个和来自POST数据的2个。但是查询字符串容易受到篡改。因此,无法保证如何将返回的值分割为GET和POST部分。 - code_angel

2

1
大家好,感谢你们抽出时间。我原本期望有类似于PHP的$_POST和$_GET的东西。最终,getParameter()方法更像是PHP的$_REQUEST。我会将@hvieira的答案标记为好的,因为提供的链接解释了我的问题(虽然没有解决它),并且处理原始响应正文的建议非常适合我所问的问题。无论如何,感谢大家的评论!最后,你们是对的,没有必要纠结参数来自哪里...我只是关注于PHP的$_POST和$_GET数组。Nico - Nico

0

你有检查过request.getAttribute()返回的内容吗?

无论如何,你都无法避免人们试图通过url或者篡改post请求来发送恶意数据。

所以当你处理来自网站的输入时,一定要想象一个黑客坐在另一边,并向你的参数发送恶意内容,比如sql注入。因此,你需要一个良好的验证机制,只允许好的内容进入你的数据库。

因为如果用户将他的用户名作为url中的参数输入,这不是你的问题。如果他更喜欢这种方式而不是输入框,就让他去享受吧。黑客才是问题所在。


-2

我认为这是前端代码的问题,而不是servlet的问题。来自UI的任何POST请求提交都应该剥离查询字符串。


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