【问题标题】:Request parameters are dropped in Tomcat请求参数在 Tomcat 中被丢弃
【发布时间】:2012-11-13 15:28:45
【问题描述】:

客户端代码:

    FormDataBodyPart f = new FormDataBodyPart(...);
    FormDataBodyPart f2 = new FormDataBodyPart(...);
    MultiPart multiPart = new MultiPart();
    multiPart.bodyPart(f);
    multiPart.bodyPart(f2);

    //Execute Call
    WebResource wr = resource().path(Url.X);
    wr = wr.queryParam("subjectId", "value_something");
    ClientResponse response = wr.type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, multiPart);

服务器代码:

String id = req.getParameter("subjectId");

req 是 HttpServletRequest - 由 spring 注入

@Context
protected HttpServletRequest httpServletRequest;

问题:在某些环境中,检索到的id 参数为空。在过滤器中,我们打印 while 请求参数映射以登录它只是空的。
我们认为问题出在服务器端,因为执行相同的客户端与不同的环境会产生不同的结果。
在某些服务器上,来自所有客户端的参数始终为空,而在其他环境中,来自所有客户端的参数始终存在。
所以...看起来是 Tomcat 方面的问题,但是...在哪里?

更新:服务器上wireshark的结果:

[Malformed Packet: MIME multipart]
Expert Info (Error/Malformed): Malformed Packet (Exception occurred)
Message: Malformed Packet (Exception occurred)

尽管有错误,但在某些服务器上 - 参数存在,而在其他服务器上,参数丢失。



更新:AccessLogValve 记录的请求包含参数
127.0.0.1 - - [26/Nov/2012:03:04:58 -0800] "POST /api/get-retrieve?x=y HTTP/1.1" 200 16
所以,问题可能出在 Tomcat 中某处抛出这些参数...

【问题讨论】:

  • 在 tomcat 之前有 rev 代​​理吗? Ngnix httpd haproxy ?
  • 我们正在使用这个haproxy.1wt.eu - 我也尝试了直接访问而不通过负载平衡器。直接访问它也失败了,但我需要与 IT 重新检查直接确实没有映射到某个地方......
  • 我会尝试 tcpdump 从客户端传出的 http 流量,然后进入 tomcat 以查看请求中是否存在参数。
  • 所以它看起来像一个球衣错误......你可能会做一些球衣调试并看到请求出来,也许你会指出有问题的代码。

标签: java web-services tomcat servlets jersey


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    检查请求对象是否有效? 您也可以尝试其他方法,例如使用 request.getParameterMap() 读取参数或读取输入流。

    【讨论】:

    • request.getParameterMap() 为空
    猜你喜欢
    • 2016-05-13
    • 2018-10-04
    • 2021-10-27
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多