zoukankan      html  css  js  c++  java
  • 【2019】问题记录一:后端获取URL参数的值内加号“+”变成空格“ ”

    问题:URL参数中加号“+”变成空格“ ”

    一、现象

         URL如:http://example.****.com/controller/action?param=rice+cook+panda

      后端通过Request.QueryString["param"]的方式获取值的时候,数值中的加号“+”会转换为空格“ ”

      例如传输“rice+cook+panda”,就会取到“rice cook panda”

    二、原因

      W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。

      而在另一份规范RFC2396,定义URI里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。

      所以一个安全的举措是URL中统一使用%20来编码空格字符。

    三、解决思路和方法

      了解了原因,解决就针对出现这种情况的原因做处理。

           处理思路:将URL中的+号替换为%2B

           处理后的URL应为:http://example.****.com/controller/action?param=rice%2Bcook%2Bpanda

           1、发送端处理办法

      不同的编程语言对此类问题解决方法,大同小异,最终目的都是将参数内的加号“+”替换为%2B:

            Java解决方法(推荐)

     URLEncoder.encode("rice+cook+panda","UTF-8"); 

            C#解决方法(推荐)

     HttpUtility.UrlEncode("rice+cook+panda"); 

     Server.UrlEncode("rice+cook+panda") 

            JS解决方法(推荐)

     encodeURIComponent("rice+cook+panda") 

    通用笨方法(不推荐):将参数内的+号采用repace函数替换为%2B

            2、接收端处理办法

           此问题原因出在发送端,所以不建议在接收端做特殊处理。

      特殊情况下(只针对某单个URL的参数临时应急):接收端处理方法,可强制将获取参数内的空格变为加号" "通过Replace方法“ ”替换为+号(不推荐使用,这个就是坑)

    四、问题拓展延伸

      这个提问,主要是URL对参数内的特殊符号进行了特殊处理导致,+号有这种情况,自然其他特殊符号也存在类似情况 如: / = 等。

      因此推荐采用各种编程语言内部处理url的函数来解决此类问题,不建议采用发现一个替换一个的方式,更不建议接收端做特殊处理。

    自由、人生、意义、执着、残缺美 一个人认真的学习者 --------2015年3月19日
  • 相关阅读:
    分布式文件系统 FastDFS
    Autoit里用多进程模拟多线程
    请不要做浮躁的人(新手必读!)
    如何用AU3调用自己用VC++写的dll函数
    DLL编写教程
    win32下的命令行集合 (最优秀的工具)
    autoit 《FAQ 大全》
    Windows XP 常用DOS命令
    rundll32 常用命令
    批处理的高级运用技巧
  • 原文地址:https://www.cnblogs.com/littlemo/p/10968050.html
Copyright © 2011-2022 走看看