记录折腾的那点事
在折腾的道路上永不止步

Tomcat传json报400错误和请求url地址中包含大括号{}

今天更新了一下tomcat, 一个接口访问失败,只看到日志中有一个java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986.
因为我传递的是JSON格式, 使用字符串接收, 但是RFC不允许还特殊字符. 也就是说我们的请求中用了无效的字符。
查看RFC规范知,url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~四个特殊字符以及保留字符( ! ’ ( ) ; : @ & = + $ , / ? # [ ] ) (262+10+4+18=84)这84个字符.
而我们的请求中出现了{}大括号,所以tomcat报错.

根据rfc规范,url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在tomcat升级到8以后,对url字符的检查都变严格了,如果出现这类字符,tomcat将直接返回400状态码。
后来有人对此提出了异义,见:    https://bz.apache.org/bugzilla/show_bug.cgi?id=60594
经过一番讨价还价,tomcat的开发人员增加一项设置,允许配置在url可以出现的特殊字符,但也仅限于|,{,}三种,见:http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#Other
该项设置在以下版本的tomcat中有效:
– 8.5.x for 8.5.12 onwards  https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.12/bin/
– 8.0.x for 8.0.42 onwards  https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.42/bin/
– 7.0.x for 7.0.76 onwards  https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.76/bin/

各种google, 百度, 发现只找到之后三种解决方案

第一种

更换低版本的Tomcat来规避这种问题。

这不是扯淡吗, 我就想用高版本的

第二种

在conf/catalina.properties中最后添加一行:

org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

使用url转码第三种

前台encodeURIComponent(***)

后台URLDecoder.decode(jsonStr, “utf-8”);

赞(2)
未经允许不得转载:ghMa » Tomcat传json报400错误和请求url地址中包含大括号{}
分享到: 更多 (0)

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址