问题: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的函数来解决此类问题,不建议采用发现一个替换一个的方式,更不建议接收端做特殊处理。

【2019】问题记录一:后端获取URL参数的值内加号“+”变成空格“ ”的更多相关文章

  1. js 获取url参数的值

    //获取url参数函数function GetQueryString(name){    var reg = new RegExp("(^|&)"+ name +" ...

  2. asp.net mvc 在View中获取Url参数的值

    如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3   这时想在 ...

  3. JS获取URL参数的值

    function getQueryValue (key) { const reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', ' ...

  4. asp.net mvc 如何在View中获取Url参数的值

    如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3   这时想在 ...

  5. MVC View中获取Url参数的值

    如果url是 /home/index?id=3 直接Request就ok. Razor方法 @Html.ViewContext.RouteData.Values["id"] @Re ...

  6. javascript如何获取URL参数的值

    function getUrlParameter(strParame){ var args = new Object( ); var query = location.search.substring ...

  7. Angularjs中使用$location获取url参数时,遇到的坑~~~

    今天在开发时候,需要用到Angularjs1.4.6获取url参数,网上查了一下,有部分文章提到用$location来获取.大致方法如下 var app = angular.module('myApp ...

  8. asp.net 正则获取url参数

    现在有一种场景:Url是数据库里面的,里面带有很多参数,如何获取具体参数的值呢? var uri = new Uri(pageUrl); var queryString = uri.Query; va ...

  9. js对特殊字符转义、时间格式化、获取URL参数

    /*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...

随机推荐

  1. loj2055 「TJOI / HEOI2016」排序

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  2. hdu3366 Count the string

    考虑dp[i]代表前缀s[1...i]出现的次数,必定有dp[nxt[i]] += dp[i] 倒着推就是了 #include <iostream> #include <cstrin ...

  3. 5、CSS基础part-3

    1.CSS列表 ①类型 ul.disc {list-style-type: disc} ②位置 ul.inside {list-style-position: inside} ③列表图像 2.表格

  4. 12 JVM 垃圾回收(下)

    Java 虚拟机的堆划分 Java 虚拟机将堆划分为新生代和老年代.其中新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区. 默认情况下,Java 虚拟机采取一种动态分配的策略, ...

  5. log4net实现多实例记录

    原文地址:实现多个LOG4NET日志记录器实例 本文内容为摘抄,请查看原文. 对于.NET Framework开发者来说,使用Log4Net进行日志记录是非常方便的,通常只要写好配置文件和简单的编码就 ...

  6. 洛谷4438 [Hnoi2018]道路 【树形dp】

    题目 题目太长懒得打 题解 HNOI2018惊现普及+/提高? 由最长路径很短,设\(f[i][x][y]\)表示\(i\)号点到根有\(x\)条未修公路,\(y\)条未修铁路,子树所有乡村不便利值的 ...

  7. 关于python的整形(int)自动转长整形(long)的问题

    有时需要访问某个接口,其中传入的整形参数可能比较长就会变成long,这时如果用str()的话‘L’就会被转化到字符串中,导致接口不能识别: 这种情况下应该优先使用json来转译,可以完美保持翻译pyt ...

  8. Maven 的基本用法

    一.Maven 的安装 二.Maven的常用构建命令 1.mvn -v 查看maven版本 2.mvn compile 编译 3.mvn test 测试 4.mvn package 打包 5.Mvn  ...

  9. 深海机器人(cogs 742)

    «问题描述:深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动.深海机器人在移动中还必须沿途采集海底生物标本.沿途生物 ...

  10. time stamp in javascript

    JavaScript 获取当前时间戳: 第一种方法: var timestamp = Date.parse(new Date()); 结果:1280977330000 第二种方法: var times ...