1.几个问题
1) post请求参数是否编码
2) post请求参数为json, 是否编码
最近项目中遇到一个问题,某个业务的接口需要传一个签名参数,但是签名中包含一些特殊字符,debug发现
服务端接受到的参数会将某些特殊字符过滤掉,比如/ .
环境信息:
1) 服务器: tomcat8
2)请求接口协议: http
3) http请求方式: post
4) 参数格式: content-type为application/x-www-form-urlencoded
5) 签名参数: base64编码,包含/ ,+ ,=三个特殊字符
2. tomcat处理请求参数源码
上图表面只处理form-data和x-www-form-urlencoded 两种方式的POST请求参数,json格式默认直接以二进制流的形式处理,不会参与URL编码
parameters.processParameters(formData, 0, len);
switch(bytes[pos]) {
case '=':
if (parsingName) {
// Name finished. Value starts from next character
nameEnd = pos;
parsingName = false;
valueStart = ++pos;
} else {
// Equals character in value
pos++;
}
break;
case '&':
if (parsingName) {
// Name finished. No value.
nameEnd = pos;
} else {
// Value finished
valueEnd = pos;
}
parameterComplete = true;
pos++;
break;
case '%':
case '+':
// Decoding required
if (parsingName) {
decodeName = true;
} else {
decodeValue = true;
}
pos ++;
break;
default:
pos ++;
break;
}
} while (!parameterComplete && pos < end);
上面源码是处理类似name=xx&id=xx格式的参数
其中关键点: decodeName 代表参数名是否编码,即是否含有特殊字符或中文等
decodeValue代表参数值是否编码,即是否含有特殊字符或中文等
举例说明: 如果name=中文
那么接受参数的时候decodeValue会被urlencode编码,也就是中文对应的Unicode的Utf-8格式编码,然后前面加上%