服务请求丢失了参数

Posted

技术标签:

【中文标题】服务请求丢失了参数【英文标题】:Servet request lost the params 【发布时间】:2012-11-13 17:34:43 【问题描述】:

与Request parameters are dropped in Tomcat相关的问题

嗯...显然,在某些服务器上,即使是以下最简单的请求也会丢失参数,而有些则可以。

@GET
@Path("/get-retrieve")
public String foo()
    return ""+httpServletRequest.getParameterMap().size();

所以返回值为0(零)。

更新:AccessLogValve记录的请求中包含参数

127.0.0.1 - - [26/Nov/2012:03:04:58 -0800] "POST /api/get-retrieve?x=y HTTP/1.1" 200 16

所以,问题可能出在 Tomcat 中某处抛出这些参数...

【问题讨论】:

这不是人们在 *** 上提问的方式。发布代码和一个损坏的配置,这样我们就可以运行它并找出问题所在。 这是我拥有的全部代码,它是一个丢失参数的简单 GET。我正在寻找帮助和方向,而不仅仅是直接的解决方案。 你是盲人还是什么?日志显示POST /api/get-retrieve HTTP/1.1。你甚至否决了我的回答。您不断向带有 @GET 注释的方法发送 POST 并询问为什么它不起作用... 日志 'POST' 是复制粘贴错误。它是“得到” 我从未听说过粘贴替换。为什么不在foo() 签名中使用@QueryParam 【参考方案1】:

我们遇到了这个问题,结果证明我们允许多个线程访问HttpServletRequest 对象。这是不允许的。它不是线程安全的。

【讨论】:

【参考方案2】:

确保你没有将 httpServletRequest 传递给另一个线程。

【讨论】:

【参考方案3】:

我曾经遇到过这种情况,经过长时间的调查发现问题出在 Tomcat 的 server.xml 中连接器的定义中:

<Connector connectionTimeout="20000" maxHttpHeaderSize="9000" maxParameterCount="100" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

查看“maxParameterCount”的定义,在我们的例子中它被设置为 0 导致所有请求参数被丢弃。

【讨论】:

【参考方案4】:

基于链接问题中发布的代码

wr.type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, multipart);

问题可能是您使用@GET 注释您的方法,但实际上您的客户发出POST。也许 JAX-RS 的某些实现仍将请求路由到您的方法,但由于方法不匹配而无法提取参数。比较一下 GET 的样子后,算法确实有很大不同:

GET /path/to/resource?id=foobar HTTP/1.1
Host: example.com

还有一个帖子:

POST /path/to/resource HTTP/1.1
Host: example.com
Content-Type: multipart/form-data, boundary=A9zfsdf0x;9ad

--A9zfsdf0x;9ad
content-disposition: form-data; name="id"

foobar

因此,当您设计 RESTful API 时,您应该仔细选择方法,并在客户端和服务器上都使用它。

【讨论】:

嗨,在链接的问题中,POST 转到 POST。在这个小例子中,它是一个由 GET 执行的 GET... 那么如何重现您的问题呢?整个世界都在 JavaEE 上运行的可能性很小,而您发现了一个关于 GET 解析的错误...... 我不确定,我在这里寻求帮助。我办公室有 3 位主机有问题,另外 3 位还可以...

以上是关于服务请求丢失了参数的主要内容,如果未能解决你的问题,请参考以下文章

一次生产上由于Nginx引起的HTTP请求Header参数丢失的问题

请求参数丢失加号

Nginx配置http强转https,参数丢失问题

解决使用webbrowser请求url时数据传递丢失问题

RedirectToAction() 丢失请求数据

nginx反向代理后丢失origin参数