zoukankan      html  css  js  c++  java
  • 请求地址中含有特殊字符#时如何有效处理

      今天在调试过程中发现当请求参数中含有特殊字符时,某些参数值传递到后端时已经发生了变化,例如在请求参数中含有#字符时,后端收到的参数值是没有#字符和其后面字符的内容,在Chrome浏览器中按下F12后在Network中可以看到请求的地址中针对含有#字符的请求参数,其#字符和后面的字符都被截断了,于是想到需要对这类请求参数进行编码处理。由于这个请求是编排器将Vue对象送给前端时created方法或computed方法自动调用的,所以要想在前端做修改是不太可能的了,只能在后端处理,但是后端处理后也是供前端调用的。那在后端哪里处理比较合适呢?应该有个拼接请求地址的地方吧,我们就从那里着手处理吧,这样就可以对所有的某一类参数值进行设置。由于这个拼接的地址是要供前端调用的,所以在使用编码方法时是能符合前端JS调用的才可以。这里想到了前端两个编码函数:encodeURI和encodeURIComponent,下面分别添加这两个函数对请求参数进行编码处理,看看效果。

    (1)encodeURI函数

    后端这样拼接地址,例如:'http' + '//IP:port/targetAddress?param='+encodeURI(value),其中value是含有#字符的值

    浏览器中结果显示:#字符和其后面的字符依旧被截断了

    (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闪

  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/bien94/p/11972893.html
Copyright © 2011-2022 走看看