3

Tomcat中丢弃了与Request参数相关的问题

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

@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的某个地方扔掉了那些参数......

4

4 回答 4

4

我有过一次,经过长时间的调查后发现问题出在Tomcat的 server.xml 中的连接器定义中:

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

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

于 2012-11-26T12:31:13.793 回答
0

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

于 2013-12-13T15:01:48.003 回答
0

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

于 2014-08-15T13:34:08.563 回答
-1

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

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 时,你应该仔细选择方法,并在客户端和服务器上都使用它。

于 2012-11-26T10:32:32.780 回答