请求地址中含有特殊字符#时如何有效处理

摘要:
今天在调试过程中发现当请求参数中含有特殊字符时,某些参数值传递到后端时已经发生了变化,例如在请求参数中含有#字符时,后端收到的参数值是没有#字符和其后面字符的内容,在Chrome浏览器中按下F12后在Network中可以看到请求的地址中针对含有#字符的请求参数,其#字符和后面的字符都被截断了,于是想到需要对这类请求参数进行编码处理。所以自然而然地请求参数中就不会包含#字符和其后面的字符了,因为其特殊的含义决定了其作用。

今天在调试过程中发现当请求参数中含有特殊字符时,某些参数值传递到后端时已经发生了变化,例如在请求参数中含有#字符时,后端收到的参数值是没有#字符和其后面字符的内容,在Chrome浏览器中按下F12后在Network中可以看到请求的地址中针对含有#字符的请求参数,其#字符和后面的字符都被截断了,于是想到需要对这类请求参数进行编码处理。由于这个请求是编排器将Vue对象送给前端时created方法或computed方法自动调用的,所以要想在前端做修改是不太可能的了,只能在后端处理,但是后端处理后也是供前端调用的。那在后端哪里处理比较合适呢?应该有个拼接请求地址的地方吧,我们就从那里着手处理吧,这样就可以对所有的某一类参数值进行设置。由于这个拼接的地址是要供前端调用的,所以在使用编码方法时是能符合前端JS调用的才可以。这里想到了前端两个编码函数:encodeURI和encodeURIComponent,下面分别添加这两个函数对请求参数进行编码处理,看看效果。

(1)encodeURI函数

后端这样拼接地址,例如:'http' + '//IP:port/targetAddress?param='+encodeURI(value),其中value是含有#字符的值

浏览器中结果显示:#字符和其后面的字符依旧被截断了

(2)encodeURIComponent函数

后端这样拼接地址,例如:'http' + '//IP:port/targetAddress?param='+encodeURIComponent(value),其中value是含有#字符的值

浏览器中结果显示:#字符和其后面的字符被编码了,整个value值是被编码后的字符串了,保留在请求参数中了。

从这两个函数的编码效果可以看出:在前端JS中encodeURIComponent函数可以对#字符进行编码,而encodeURI函数不能对#字符进行编码,依旧保留#字符原样。延伸一下:encodeURI() 用于编码整个URI,因为URI中的合法字符都不会被编码转换;而encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以将参数中的中文、特殊字符进行转义,而不会影响整个URL。

虽然通过encodeURIComponent函数解决了#字符为请求参数时#字符和其后的字符都被截断的问题,但是是为什么会被截断呢?这是因为#字符对URI来说,它的作用是指向一个锚点,例如:xx?param=wb#gg,那么这URL实际上是定位到xx?param=wb这个页面中的ID为gg的元素位置。所以自然而然地请求参数中就不会包含#字符和其后面的字符了,因为其特殊的含义决定了其作用。

要是不想主动调用encodeURIComponent函数对请求参数进行编码,那么可以将请求参数放在请求体,在ajax中可以将参数放在data属性中,这样会自动调用encodeURIComponent函数对data数据进行编码。

------20191202闪

免责声明:文章转载自《请求地址中含有特殊字符#时如何有效处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Selenium自动化之鼠标双击操作Java Web项目案例之---登录和注册(精华版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CString之Find()、FindOneOf()、ReverseFind()

一、CString之Find()、FindOneOf()、ReverseFind() 此三个函数返回值均为整数int。 1、Find() 该函数从左侧0索引开始,查找第一个出现的字符位置,返回position。示例如下: 1 CString s("abcd"); 2 ASSERT( s.Find('b') == 1 ); 返回值:...

三篇文章了解 TiDB 技术内幕——说计算

在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句。 假设我们有这样一个表的定义: CREATE TABLE User { ID int, Name varchar(20), Role varchar(20), Age int, PRIMARY KEY (...

JAVA IO流常见问题

1、字节流和字符流的区别? (1)读写单位不同:字节流以字节(8 bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。 (2)处理对象不同:字节流能处理所有类型的数据(如图片、avi 等),而字符流只能处理字符类型的数据。 (3)字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用 colse() 方法...

Oracle 11g 数据类型

  Oracle 11g Datatypes VARCHAR2(size [BYTE | CHAR]) 可变长度的字符串的最大长度有大小字节或字符。最大尺寸是4000字节或字符,最低为1个字节或1个字符。您必须指定VARCHAR2大小。 字节表示该列将有字节长度语义。 CHAR列表示将字符语义。 NVARCHAR2(size) 可变长度的Unicode字符...

Oracle 和SQL Server 中的SQL语句使用区别

最近开始接触Oracle,想要了解下同SQL Server使用时的区别。搜寻网上信息找到具体区别分类如下: 一、数据类型比较  类型名称 Oracle  SQLServer  比较  字符数据类型  CHAR  CHAR  都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb  变长字符数据类型  VAR...

前端团队成长计划(一):基础知识梳理

一个月前我开始了前端团队的成长计划,主要主语两方面的考虑:校招应届生能快速进入工作的状态达到一个能支撑业务的技能水平,提前学习主流前端技术,为未来的业务代码重构做储备。5月是整个计划的第一个阶段,主要的任务是,梳理常规前端基础知识和开发技能。 5月的计划如下:(偏基础) 1、js和css的一些规范以及常规功能如何实现; 2、了解现有业务工程的开发,部署,上...