• URI 中特殊字符处理



    一、问题阐述

      今天写 url 请求时,不管是get 请求还是 post 请求,如果参数中带有 + % # 等特殊符号,就无法正常获得参数

      具体现象就是 用URL传参数的时候,用&符号连接,如果某一个参数中含"#$ ^ & * + ="这些符号的时候,在另一个页面getParameter就会取不到传过来的参数。

    二、解决方法

      有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了

      1)下面列出了一些URL特殊符号及编码十六进制值

    • +    URL 中+号表示空格             %2B 
    • 空格 URL中的空格可以用+号或者编码 %20 
    •  /    分隔目录和子目录  %2F   
    • ?     分隔实际的 URL 和参数 %3F 
    • %   指定特殊字符 %25 
    • #    表示书签 %23 
    • &    URL 中指定的参数间的分隔符 %26 
    • =    URL 中指定参数的值 %3D

       2)java 实现

        如果代码采用java 来访问请求的话,可以采用 URLEncoder.encode(param,"utf-8") 将参数值编码,对应的解码方法为URLEncoder.decode()

        java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s); 

        比如     

    1
    String str = "http://localhost:8980/select?param=" + URLEncoder.encode("bcpuser$userid$1#3#4","utf-8") ; <br>//得到结果  http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

        得到url 可以直接在浏览器上访问,如果后台采用的java+ springMVC,可以直接得到预期的参数(无需再次解码的)

      3)C# 实现

      C#中编码的主要方法:HttpUtility.UrlEncode (不推荐)、Server.UrlEncode (不推荐)、Uri.EscapeUriString、Uri.EscapeDataString。(更多详情,看参考)

    1
    2
    String str = "http://localhost:8980/select?param=" + Uri.EscapeDataString("bcpuser$userid$1#3#4");
    //得到结果  http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

      

      4) javascript 实现方法

      javascript中的编码有三种方法:escape (不推荐,对ASCII符号正确编码)、encodeURI、encodeURIComponent

      encodeURI:用于对网址编码(不包含参数)

        encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

        encodeURI就是为这个而设计的。encodeURI不对URI中的特殊字符进行编码,如冒号(:)、斜杠(/)。下面看个示例:

    1
    2
    encodeURI("http://www.cnblogs.com/a file with spaces.html")
    // outputs http://www.cnblogs.com/a%20file%20with%20spaces.html

        可以看到仅仅把空格替换成了20%,所以此方法可用于对网址进行编码。

        由于encodeURI不对冒号(:)、斜杠(/)进行编码,所以如果参数(如把网址作为参数)中包含冒号(:)、斜杠(/),就会解析出错,所以此方法不能对参数进行编码。

       encodeURIComponent:用于对网址参数进行编码

        encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

        可以看到此方法对:/都进行了编码,所以不能用它来对网址进行编码。由于此方法对中文,空格,井号(#),斜线(/),冒号(:)都进行了编码,所以适合对URI中的参数进行编码。看下面的示例:

    1
    2
    3
    var param="博客园";
    var url="http://www.cnblogs.com/?key="+encodeURIComponent(param)+"&page=1";
    console.log(url);//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1

     三、总结

      这里我并没有写的很详细,只是达到了我的目的,故暂时记录这么多。

      因为问题出现传递的参数里包含特殊符号而导致参数获取错误,故这里在url 拼接参数的时候,将参数的值编码后传递即可(原理如此,不限语言)

    参考博客:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html

    ,"utf-8") 

  • 相关阅读:
    HTTP 501 错误 – 未实现 (Not implemented) 或者是 Failure: Address already in use
    HTTP 400 Bad request 原因
    树莓派 NAS aria2 下载磁力链接无速度
    踩坑备忘之“yarn : 无法加载文件 C:\Users\siazon\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。"
    架构小试之IDL
    服务端基本概念和指标
    git常用命令
    mysql20211116
    blog JavaJinguo
    android 分享功能
  • 原文地址:https://www.cnblogs.com/jpfss/p/10233721.html
Copyright © 2020-2023  润新知