今天更新了一下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”);
最新评论
mat插件可以检测内存数据
标识接口?
序列化serializabel就是一个标识
就差一个MAC了
mark
除了预置sql查询字段,其他我竟然都没用过
可以,这个问题遇到过
mybatis多个参数: 1. 注解(最常用) 2. 转化为对象或MAP 3. 按顺序(这个最蠢,写的代码看得费劲) 单个参数需要注意得: 1.基本数据类型随便写 2.数组用array,l