【2019】问题记录一:后端获取URL参数的值内加号“+”变成空格“ ”
问题:URL参数中加号“+”变成空格“ ”
一、现象
URL如:http://example.****.com/controller/action?param=rice+cook+panda
后端通过Request.QueryString["param"]的方式获取值的时候,数值中的加号“+”会转换为空格“ ”
二、原因
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参数的值内加号“+”变成空格“ ”的更多相关文章
- js 获取url参数的值
//获取url参数函数function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +" ...
- asp.net mvc 在View中获取Url参数的值
如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3 这时想在 ...
- JS获取URL参数的值
function getQueryValue (key) { const reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', ' ...
- asp.net mvc 如何在View中获取Url参数的值
如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3 这时想在 ...
- MVC View中获取Url参数的值
如果url是 /home/index?id=3 直接Request就ok. Razor方法 @Html.ViewContext.RouteData.Values["id"] @Re ...
- javascript如何获取URL参数的值
function getUrlParameter(strParame){ var args = new Object( ); var query = location.search.substring ...
- Angularjs中使用$location获取url参数时,遇到的坑~~~
今天在开发时候,需要用到Angularjs1.4.6获取url参数,网上查了一下,有部分文章提到用$location来获取.大致方法如下 var app = angular.module('myApp ...
- asp.net 正则获取url参数
现在有一种场景:Url是数据库里面的,里面带有很多参数,如何获取具体参数的值呢? var uri = new Uri(pageUrl); var queryString = uri.Query; va ...
- js对特殊字符转义、时间格式化、获取URL参数
/*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...
随机推荐
- Django权限管理系统设计分析
权限管理顾名思义,其实就是角色控制权限的系统,每个用户对应一个角色,每个角色有对应的权限,比如公司会有CEO,总监,销售经理,销售员,每个人的权限都不一样,那我们给他展示的url也都不同 一.首先创建 ...
- laravel5.2总结--服务提供者,契约(Contracts)
首先理解两个概念 1.契约:一组定义了框架核心服务的接口 2.服务提供者:所有 Laravel 应用程序启动的中心所在. 包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者 ...
- User Account Control
User Account Control 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! User Account Control (UAC : 用户帐户控制)是微软为 ...
- 【Maximum Subarray 】cpp
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- 【Restore IP Addresses 】cpp
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- 简单实现nodejs爬虫工具
约30行代码实现一个简单nodejs爬虫工具,定时抓取网页数据. 使用npm模块 request---简单http请求客户端.(轻量级) fs---nodejs文件模块. index.js var ...
- sql2005 和sql2008 同时安装
Hkey_local_machine\Software\Wow6432Node\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM 中的ShellSEM重 ...
- stdlib.h中自带的两个算法qsort,bsearch
http://zh.cppreference.com/w/c/algorithm ========== void qsort( void *ptr, size_t count, size_t size ...
- HEAD DETACHED push origin失败问题
先说HEAD HEAD是一个头指针,通常情况下指向不同的分支,每个分支对应一个commit(准确的说,每个分支对应多个commit,但是只有一个顶层的commit,而commit之间是简单的线性关系. ...
- 序列(seq)
序列(seq) 题目描述 给定 N,A,BN,A,B,构造一个长度为 NN 的排列,使得: 排列长度为 N: 最长上升子序列长度为 A: 最长下降子序列长度为 B. 我们有 SPJ,有解任意给出一组, ...