【问题标题】:Tomcat 8.5: Required String parameter '...' is not presentTomcat 8.5:必需的字符串参数“...”不存在
【发布时间】:2017-11-24 00:10:44
【问题描述】:

在从 Tomcat 7.0.50 升级到 Tomcat 8.5.15 期间,它停止识别我的一种方法的 POST 参数之一:我得到的不是正常响应,而是这条消息

HTTP 状态 [400] – [错误请求]

类型状态报告

消息必需的字符串参数“密码”不存在

说明由于某些被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由),服务器无法或不会处理请求。

Apache Tomcat/8.5.15

方法签名是:

@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> login(
    @RequestParam("password") String passwordHash,
    @RequestParam("username") String loginName,
    @RequestParam(value = "clientId", required = false) String clientId,
    HttpServletRequest request,
    HttpServletResponse response)
    throws NoSuchAlgorithmException {//...

我已经从请求中捕获了流量,如您所见,password POST 参数包含在 POST x-www-form-urlencoded 参数中:

POST http://<masked>/Server/user/login HTTP/1.1
Host: <masked>
Connection: keep-alive
Content-Length: 270
Origin: http://<masked>
X-Requested-With: ShockwaveFlash/26.0.0.131
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://<masked>
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,ru;q=0.6,he;q=0.4
Cookie: <masked>

noremember=true&password=C9TUq%2BYMIbeoW%2ByfoSCt9QJoOnmSGR8BqRKdOjufjE7%2FoHUDpPf3FHSvCUbZu4EBSKkJV2ryGs1Q77D7SFbBKZZ3joWcMTN6aTsgmPsOdW0Md1qcOkB4w4L3F53XZRlKUp2RaxCjoE0AIr%2B0WLomGFSrn8u8iTf2p4Z7Mo6ZKPA%3D&username=test%40example%2Ecom&clientId=1858390758%2E1481631908

奇怪的是它在 Tomcat 7 下完美运行

如何解决这个问题?

【问题讨论】:

  • 你检查过只有密码没有找到吗?您可以先通过测试其他参数来检查您是否仍然收到@RequestParam("username")
  • @Nathan 好吧,我试过运行curl --data 'password=C9TUq%2BYMIbeoW%2ByfoSCt9QJoOnmSGR8BqRKdOjufjE7%2FoHUDpPf3FHSvCUbZu4EBSKkJV2ryGs1Q77D7SFbBKZZ3joWcMTN6aTsgmPsOdW0Md1qcOkB4w4L3F53XZRlKUp2RaxCjoE0AIr%2B0WLomGFSrn8u8iTf2p4Z7Mo6ZKPA%3D&amp;clientId=1858390758%2E1481631908' http://&lt;masked&gt;/Server/user/login(没有username 参数),但错误仍然存​​在:Required String parameter 'password' is not present
  • 我相信错误不仅仅来自password缺失。只不过@9​​87654330@映射的第一个参数是password。例如,我建议将@RequestMapping("username") 放在带密码的前面。如果错误变成Required String parameter 'username' is not present,那么你就知道没有解析任何参数。
  • @Nathan(我现在更容易不碰现有代码)我有另一个 GET/POST 方法isLoginNameAvailable,唯一需要的参数loginName,在发送时不会被解析在 POST 请求中,但是当我使用 GET 参数发送它时被解析。我可以得出结论,根本不处理 POST 参数,而 GET 参数是
  • 使用 POST 方法时,您应该使用 @RequestBody 而不是 @RequestParam

标签: java spring tomcat tomcat7 tomcat8


【解决方案1】:

终于找到原因了。 我在 Tomcat 7.0.50 的旧配置中拥有 server.xmlConnector 中的 maxPostSize="0"parameter,并且我已将其复制到新配置中,但由于 Tomcat 版本 7.0.63 maxPostSize="0" 没有表示无限,但“空”,所以应该使用maxPostSize="-1"

maxPostSize 的值为零的含义也已 更改为表示零限制而不是没有限制以使其与 maxSavePostSize 并且更直观。 (市场)

Tomcat 7.0.63 changelog

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 2021-04-01
    • 2018-05-03
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多