通过URL传递参数的一个有趣的意外

 

    我们可能经常会用到通过URL后面追加parameter的方式来传递参数,如果我们使用javascript的方式来传递一些中文或者特殊字符的内容作为参数的时候,可能就会用到escape()方法,这个方法就是对字符进行加密,之所以这样做,就是为了保证这些内容到达服务器端以后,可以被正常地识别,如果我们不进行处理,那么就有非常大的几率造成我们传递的参数到达服务器端后变成乱码,以至于无法正常识别。


    我们这里要讲的不是详细介绍这个加解密的过程,而是要说下其中的一个特殊情况,由于我在客户端使用的是javascript的escape()方法将文件名”方法+好.docx”进行加密,然后传递到服务器端进行处理,但是到了服务器端,通过Request得到的参数值居然为“方法 好.docx”,即加号变成了空格!


    我们先来看看escape()不能处理的字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z


    其中就有我们要处理的加号,经过测试,加号的确被原样传递到了服务器端,但是为什么从后台读出来的变成了空格了呢?我们还需要了解一点:”+”的URL编码为”%2b”,同时,如果对”+”进行URL解码,得到的会是空格。这是一个比较特殊的变换。于是,我又将服务器端针对3种客户端URL编码不能处理的特殊字符进行了一下URL编码测试,得到的结果如下:

    *, -, ., _, !, ', (, ) 这8个字符不能被编码。


    于是,之前出现的问题就迎刃而解了,就是因为对”+”进行URL解码会得到一个空格,但恰恰在客户端的URL编码的时候,漏掉了对”+”的编码,于是就有了这么一场的误会!

   
       经过测试,只有”+”会有这样的类似问题,只要在客户端再添加一个对该特殊字符的额外处理函数,将其替换为”%2b”,问题即可解决了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值