最近项目中用到了不少URL传值,普通的都没问题,昨天不经意间发现传值之前的值是“c++”,接收之后就变成“c”了。刚开始以为我的URL写错了,检查之后发现也没有问题,而且传不带+号的值也没有任何问题。自己猜想是不是因为“+”比较特殊导致的问题啊,虽然基本上可以断定就是“+”出的问题,但是这个符号又不能避免,头大了一下午也没想出具体的解决办法。
直到今天早上,不经意间发现班上某位女同学在逛淘宝,具体是谁我就不点名了。我发现淘宝中也是用的URL传值,大家都承认淘宝网站做的比较成功,于是就想淘宝也肯定遇到过这样的情况。真实踏破铁鞋无觅处啊,回到座位上自己也打开淘宝搜索了一下“c++”,果然大有不同。
我自己的URL是:http://localhost:37619/EvaluationStudentAssess/StudentAssess?CourseName=c++&TeacherCourseID=sdaf
淘宝的URL是:http://s.taobao.com/search?q=c%2B%2B&commend=all
我的“++”到了淘宝就成了“%2B%2B”,此事必有蹊跷,于是我把自己地址中的”+“也换成了“%2B”果然可以正常传值。有事一番搜索,才URL在传递的时候URL中的字符必须是ASCII码字符,而ASCII码字符又比较少,因此URL中经常会包括以下ASCII以外的字符如:非英文字符,特殊符号,汉子等。因此“+” "#" "&"等这些特殊符号再被传递的过程中就变成空格了。就导致我们想要传递的值到最后不是我们想要的了。要想保证正常使用,就必须对URL进行转换,这个过程叫做URL编码,实质上就是将URL中的非ASCII码字符转化为ASCII码字符。
由于URL中的字符总是不固定的,那我们怎样根据不同情况动态的将“+”换成“2B%”呢?一下是我用到的解决办法,大家有其他方法欢迎互相交流。
通过正则表达式匹对含有特殊符号的内容,然后用replace()函数替换:
<span style="font-family:KaiTi_GB2312;"><span style="font-family:KaiTi_GB2312;font-size:18px;">r = r.replace(/\+/g, '%2B');//.replace(/\#/g, '%23').replace(/\&/g, '%26');</span></span>这里只替换了“+”部分,如有需要可自行扩展。
问题是解决了,但是如果没有留心或者测试的数据里面没有这些特殊符号,很有可能就会交给用户有问题的产品,一旦用户的数据中有这些敏感数据,系统的问题可能给用户带了巨大的损失,这些问题也并不是说细心就可以避免的,关键还得积累经验,吸收教训,相信有这次的总结以后再有传值问题肯定会拿一些敏感数据去测试,这样提早暴露问题,才能尽早找到解决方案。