如何在Java Servlet中将查询字符串参数与POST数据分离?

3
当Servlet接收到doGet或者doPost调用时,你可以使用getparameterxxx()方法在一个位置获取查询字符串或者POST数据。
如果调用是GET请求,你可以从URL/查询字符串中获取数据。
如果调用是POST请求,你可以获取经过解析的POST数据。
但是,如果你在表单调用中没有放置'action'属性,情况就有所不同。 如果你为action参数指定了完全限定或部分限定的URL,一切都很顺利。如果没有,浏览器会调用与之前的页面提交相同的URL,如果那里有查询字符串数据,你将会得到这些数据以及POST数据,而且没有办法区分它们。
或者说有吗? 我正在查看请求对象,我知道POST数据来自哪里,只是想弄清楚GET数据来自哪里,这样我就可以在POST调用上清除GET数据,在GET调用上清除POST数据(如果可能的话)。
任何建议如何安全地做到这一点?
还有,让我猜猜:你从未尝试过在表单标签中不放置action字段。 :-)
4个回答

3

你说得对,我从来没有尝试过在表单标签中不放置操作字段;-)而且我也不会这样做,因为正是你所谈论的原因。 (而且,我认为这不是有效的HTML)

我不知道有什么“干净”的方法来区分GET和POST参数,但是您可以使用HttpServletRequestgetQueryString()方法访问原始查询字符串,并且可以使用ServletRequestgetInputStream()方法访问原始POST数据。 (我在这里特别查看Tomcat API文档,尽管我认为这两个都是标准Servlet API的一部分)然后,如果需要,您可以分别解析POST数据和GET数据。 它们将(或通常应该)以相同的方式格式化,即

name1=value1&name2=value2&...

尽管可能会将&符号替换为分号(在HTTP / 1.1中技术上可以做到,直到最近我才知道)


对,我认为这是你能做的最好的。故事的寓意在于包括动作和方法在你的表单中... - Neil Coffey
很容易说,当你没有继承大量没有操作的表单的大型系统时。 :-) 但我理解你的观点。谢谢。 - stu

2
在 HTML 中,action 是 必需的,因此我猜行为会因客户端而异。

如果操作URL包含查询字符串,则仍会在存在操作时发生此情况。 - Hilton Campbell
我从未见过这种情况,但我已经在各种浏览器中尝试了“无操作”功能,它们都表现出相同的行为。这可能取决于操作参数的资格如何... - stu
回顾多年后,可能不太明显的是,这个破损的表单标签是一个大型生产应用程序的一部分,我害怕触碰如此重要的东西。因此,虽然这个问题看起来很愚蠢,但那时我的理由就是如此。 - stu

1

HttpServletRequest.getParameterxxx() 方法不能区分 GET 和 POST 参数。如果您确实需要区分它们,您需要手动解析它们,使用 getQueryString() 获取 GET 参数,使用 getInputStream()/getReader() 获取 POST 数据。


0

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