【问题标题】:Reading URL parameters when POST request with data arrives in Java Servlet当带有数据的 POST 请求到达 Java Servlet 时读取 URL 参数
【发布时间】:2015-03-27 13:36:52
【问题描述】:

在 Java servlet 中,您可以从 POST 请求中读取 JSON,例如通过

new JSONObject(toString(httpRequest.getInputStream()))

现在除了 JSON 之外,我想在 URL 中指定参数,它们可以通过以下方式读取:

httpRequest.getParameterMap().get("someURLParam")

一切正常(我在服务器端使用 AJAX 发布请求和码头)

但是

正如javax.​servlet.​ServletRequest.getParamter(String) 的 javadocs 所说,这两种方法是否以及何时相互影响,我很担心和困惑:

如果参数数据是在请求体中发送的,如发生 使用 HTTP POST 请求,然后直接通过 ServletRequest.getInputStream 或 ServletRequest.getReader 可以 干扰该方法的执行。

在我的情况下是什么意思?还是仅在内容类型为x-www-form-urlencoded 时才会干扰?或者仅当使用getParametergetParameterMap 方法就可以了?

【问题讨论】:

  • 我查看了码头的来源,他们确实只在 getParameterMap 中调用 getInputStream 如果:形成编码内容 && 尚未读取 && (放置或发布)。但是对于所有指定的容器都是这种情况吗?
  • 这个答案说它仅适用于 urlendoded 发布数据,但不支持任何官方文档的声明...stackoverflow.com/a/3831791/438742
  • 答案有点混乱,因为我显然可以在没有表单编码类型的情况下读取参数
  • 你怎么做?即使 POST 正文不是 form-urlencoded?

标签: java servlets jetty


【解决方案1】:

如果你只使用getParameter/getParameterMap,你会没事的。这是因为,在幕后,这些方法可能会调用 getInputStream。规范说 MAY 因为它取决于实现,所以行为可能因容器而异。

如果你的内容不是表单编码的,或者你正在处理一个 GET 请求等,getParameter/getParameterMap 只需要从查询字符串中获取参数,所以 Jetty 不会读取正文是有道理的那些案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2018-01-23
    相关资源
    最近更新 更多