一、概述
今天遇到一个奇怪的问题,Java
项目在接收请求时,请求URL参数中的+
号会被替换成空格,导致后端在验证签名的时候,由于拿到的参数与前端传输的参数不一致,导致签名验证失败。
二、问题原因
一番研究之下,原来是Spring MVC
在接受请求时,会对请求中的URL参数进行URLDecode
操作,即解码操作。
如果请求中的参数事先没有进行URLEncode
操作,那在被URLDecode
操作之后,其中的特殊字符可能会被转换,例如+
号。
三、解决办法
综上所述,我们在封装前端请求类时,应该对URL参数键值对中的value
进行URL编码操作。
例如这样
// 待请求字符串
key1=xu+jing+zhu&key2=xu jing zhu
// 进行Encode操作后的字符串
key1=xu%2Bjing%2Bzhu&key2=xu%20jing%20zhu
切记,只需要对value
值进行编码,key
值不需要编码,不然名字不一样,后端就取不到了。