Servet请求失去了参数

时间:2012-11-26 08:59:39

标签: java web-services tomcat servlets servlet-filters

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的某个地方抛弃那些参数......

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-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:

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