zoukankan      html  css  js  c++  java
  • 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); 

        比如     

    String str = "http://localhost:8980/select?param=" + URLEncoder.encode("bcpuser$userid$1#3#4","utf-8") ; 
    //得到结果 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。(更多详情,看参考)

    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中的特殊字符进行编码,如冒号(:)、斜杠(/)。下面看个示例:

    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中的参数进行编码。看下面的示例:

    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") 

  • 相关阅读:
    Spring使用Cache
    Spring AOP之切入点指示符
    centos下 php未安装posix扩展 安装phpsh导致的问题fix
    Linus:利用二级指针删除单向链表
    AngularJS学习之 ui router
    AngularJS学习之 angular-file-upload控件使用方法
    AngularJS学习之 登录表单 清爽验证(边学边更新)
    AngularJS图片上传功能实践
    JavaScript基础知识之 每日一题(网上搜罗来滴)
    AngularJS学习之 ngTable 翻页 功能以及利用angular service准备测试数据
  • 原文地址:https://www.cnblogs.com/panie2015/p/5885922.html
Copyright © 2011-2022 走看看