在以往的通过url进行数据传值时,如果需要传输对象,通常我是使用JSON.stringify
将键值对的值通过编译为JSON字符串,之后到另一个页面,通过JSON.parse
进行解析。直到上周遇到了一个问题。测试告诉我有一个订单没有回显,看看是不是报错了,之后进行排查,一看报错了,最初可能以为是超过url的长度了,对比一下其他订单传值都是差不多长度,并没有多长,后面调试发现传输到下一个页面的值只有一截,问题找到了,原因是因为前台用户输入了一个 特殊字符=
(等于符号),由于等于符号本身在url传输时有着特殊的作用。
为了避免这种问题的再次发生,我们需要对url进行编码,需要在传输的过程中对用户输入部分进行encodeURIComponent
编码,之后进行decodeURIComponent
进行解码。为了保险一点,传输时,不管是否为用户输入,最好都编码一次。
当然使用encodeURIComponent
不能解码的字符字母、数字、(、)、.、!、~、*、'、-和_
,其中!, ', (, ), 和 *
为 RFC 3986保留字符,我们可以通过下面这种方式将其转化为Unicode
码,需要用到时在用decodeURIComponent
进行解码
function fixedEncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
网友评论