当form-urlencoded方式的form请求参数遇上中英文特殊字符

1,086 阅读1分钟

image.png

Content-Type: application/x-www-form-urlencoded

此时,浏览器在发送Form数据时会认为数据是经过URI编码的,它会对发送的数据做一次URI解码,而直接传入’%’ 时,解码过程就会报错,导致参数字段变成(unable to decode value)

同样情况的还有中文字符 逗号(’,’),分号(‘;’)

而把传入的字符先进行一次 encodeURI() 编码后,发送就刚好是解码后的原字符

image.png

但是encodeURI() 不会编码’&’符号,而application/x-www-form-urlencoded发送Form表单数据时候是要把参数用’&’号拼接成’ k1=value1&k2=value2’这样的格式,当value值中有’&’号时,就会和拼接用的’&’发生混淆,误把value中的’&’也当作键值对分隔符。

比如我的参数输入是:

image.png

而实际请求中的参数成了

image.png

这就导致后端实际从name字段取出的值只有”这是一个”

 

要解决‘&’的问题,就是把value中的’&’也做个编码就行了,那就用到了

encodeURIComponent(),它会把’&’编码为’%26’,而当请求发送时,前面说过,会对传入的参数进行解码,这样一来,在实际的请求参数中’%26’就又成了’&’,也就往后台保存了用户原本的输入

下图中,当我输入中文的!@#¥%&,。?时,因为我在给请求传参前对其作了encodeURIComponent编码,所以在实际的请求参数中这些特殊字符又被正确的解码回来了。

不过也能看到,需要做html编码的’<>’也被还原了回来。

image.png