问题描述
使用get请求查询,传入特殊字符 []时,接口报错。
分析原因
高版本的tomcat,有个新特性:
严格按照RFC 3986规范进行访问解析,而 RFC3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。
因为get请求会将参数拼接在url之后,故参数中包含’[‘、’]'字符就会返回400。
解决办法
- 把get请求改成post请求
- 使用低版本的tomcat
- 继续用高版本的tomcat,修改tomcat配置
(…/conf/catalina.properties中,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=| ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行) - 对请求进行编码,拼在url后面的参数,先用encodeURI()转义
这里使用的第4种,因为项目中使用的是统一的get请求方法,故只需要修改get方法即可(拷来的,我是后端!!!)
get(url, params) {
let _params
if (Object.is(params, undefined)) {
_params = ''
} else {
_params = '?'
for (const key in params) {
if (params.hasOwnProperty(key) && params[key] !== null) {
_params += `${key}=${params[key]}&`
}
}
}
_params = encodeURI(_params)
return service.get(`${url}${_params}`)
},