请求地址中含有特殊字符#时如何有效处理
  今天在调试过程中发现当请求参数中含有特殊字符时,某些参数值传递到后端时已经发⽣了变化,例如在请求参数中含有#字符时,后端收到的参数值是没有#字符和其后⾯字符的内容,在Chrome浏览器中按下F12后在Network中可以看到请求的地址中针对含有#字符的请求参数,其#字符和后⾯的字符都被截断了,于是想到需要对这类请求参数进⾏编码处理。由于这个请求是编排器将Vue对象送给前端时created⽅法或computed⽅法⾃动调⽤的,所以要想在前端做修改是不太可能的了,只能在后端处理,但是后端处理后也是供前端调⽤的。那在后端哪⾥处理⽐较合适呢?应该有个拼接请求地址的地⽅吧,我们就从那⾥着⼿处理吧,这样就可以对所有的某⼀类参数值进⾏设置。由于这个拼接的地址是要供前端调⽤的,所以在使⽤编码⽅法时是能符合前端JS调⽤的才可以。这⾥想到了前端两个编码函数:encodeURI 和encodeURIComponent,下⾯分别添加这两个函数对请求参数进⾏编码处理,看看效果。
(1)encodeURI函数
后端这样拼接地址,例如:'http' + '//IP:port/targetAddress?param='+encodeURI(value),其中value是含有#字符的值
浏览器中结果显⽰:#字符和其后⾯的字符依旧被截断了
js在字符串中添加字符(2)encodeURIComponent函数
后端这样拼接地址,例如:'http' + '//IP:port/targetAddress?param='+encodeURIComponent(value),其中value是含有#字符的值
浏览器中结果显⽰:#字符和其后⾯的字符被编码了,整个value值是被编码后的字符串了,保留在请求参数中了。
从这两个函数的编码效果可以看出:在前端JS中encodeURIComponent函数可以对#字符进⾏编码,⽽encodeURI函数不能对#字符进⾏编码,依旧保留#字符原样。延伸⼀下:encodeURI() ⽤于编码整个URI,因为URI中的合法字符都不会被编码转换;⽽encodeURIComponent ⽅法在编码单个URIComponent(指请求参数)应当是最常⽤的,它可以将参数中的中⽂、特殊字符进⾏转义,⽽不会影响整个URL。
  虽然通过encodeURIComponent函数解决了#字符为请求参数时#字符和其后的字符都被截断的问题,但是是为什么会被截断呢?这是因为#字符对URI来说,它的作⽤是指向⼀个锚点,例如:xx?param=wb#gg,那么这URL实际上是定位到xx?param=wb这个页⾯中的ID为gg的元素位置。所以⾃然⽽然地请求参数中就不会包含#字符和其后⾯的字符了,因为其特殊的含义决定了其作⽤。
要是不想主动调⽤encodeURIComponent函数对请求参数进⾏编码,那么可以将请求参数放在请求体,在ajax中可以将参数放在data属性中,这样会⾃动调⽤encodeURIComponent函数对data数据进⾏编码。
------20191202闪

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。