3

当您在 servlet 中获得 doGet 或 doPost 调用时,您可以getparameterxxx()在一个简单的位置获取查询字符串或发布数据。
如果调用是 GET,则从 url/查询字符串中获取数据。
如果调用是 POST,您会得到所有为您解析的帖子数据。

除非事实证明,如果您没有在表单调用中放置“操作”属性。如果您为操作参数指定完全限定或部分限定的 url,一切正常,如果您不这样做,浏览器将调用与上一页提交时相同的 url,并且如果那里恰好有查询字符串数据,您将获得该数据以及 POST 数据,并且无法将它们区分开来。

或者有吗?我正在查看请求对象,我看到了发布数据的来源,我只是想弄清楚 GET 数据的来源,所以我可以在发布调用时擦除 GET 数据并在如果可能,在解析它之前进行 GET 调用。

知道这样做的安全方法是什么吗?

让我猜一下:您从未尝试过不在表单标签中放置操作字段。:-)

4

4 回答 4

3

你是对的,我从来没有尝试过不将操作字段放在表单标签中;-) 我不会,因为你在说什么。(另外,我认为它不是有效的 HTML)

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

name1=value1&name2=value2&...

虽然可能用分号替换了与号(从技术上讲,你可以在 HTTP/1.1 中做到这一点,直到最近我才知道)

于 2009-01-19T22:41:25.237 回答
2

在 HTML 中,动作是REQUIRED,所以我猜客户端的行为会有所不同。

于 2009-01-19T22:49:39.900 回答
1

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

于 2009-01-19T22:40:20.230 回答
0

我会编写一个 ServletFilter 并装饰请求对象以稍微清理一下(使用上面希尔顿建议的内容)。这是拦截过滤器中的经典装饰器模式

于 2009-01-19T22:45:18.270 回答