神奇“&”符,url传值踩过的坑

 由于业务需求,需要一个生成二维码的功能,生成二维码的功能用Google的jar包成功解决,并且对外提供了一个生成二维码的web接口,参数为需要跳转的url链接。后续发现一个问题,就是web端传递的url进来后,有时候生成二维码后扫描得到的链接正常,有时候就不正常,url上带的参数部分丢失了。比如qcUrl =baidu.com、qcUrl=baidu.com?param1=abc,这样的链接生成的二维码就没问题,扫描后得到的链接跟qcUrl 一致;但是qcUrl = baidu.com?param1=abc&param2=bcd这样的参数生成的链接就有问题,扫描后得到的链接变成了baidu.com?param1=abc,后面的参数丢失了。

 当时一直觉得是二维码生成有问题, 后来定位才发现问题的原因根本不是二维码生成的问题,是qcUrl = baidu.com?param1=abc&param2=bcd这样的参数传递到后端就变成了baidu.com?param1=abc,参数已经丢失了。百度了下,原因是,当通过url传参时,遇到“&”会自动截断,把参数当成独立的参数往后端传递,比如你想传递一个参数qcUrl值为“baidu.com?param1=abc&param2=bcd”到服务器端,这时候,url传参会将参数解析成qcUrl=baidu.com?param1=abc和param2=bcd这两个参数传递到后端。

         解决方案:

 1.对url中的特殊字符进行转义;

 2.将整个url参数进行encode处理;

 3.将url在web端进行base64转码,传递到服务器端后,进行解码。

1.url中常用的特殊符号对应的转义符号

特殊符号

说明

转义符号

+

URL +号表示空格

%2B

空格

URL中的空格可以用+号或者编码

%20

/

分隔目录和子目录

%2F

?

分隔实际的URL和参数

%3F

%

指定特殊字符

%25

#

表示书签

%23

&

URL 中指定的参数间的分隔符

%26

=

URL 中指定参数的值

%3D

2.代码示例:

public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "https://m.biyao.com/activity/summitMeetingBindTeam/joinTeam?it=h5-ddzdlx&inviteCode=AAAA&c=adasdfa";
        String encodeS = URLEncoder.encode(s,"UTF-8");
        System.out.println(encodeS);
    }

输出为:


3.代码示例:

public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "https://m.biyao.com/activity/summitMeetingBindTeam/joinTeam?it=h5-ddzdlx&inviteCode=AAAA&c=adasdfa";
        String data = Base64.encodeBase64String(s.getBytes("UTF-8"));
        System.out.println(data);
        System.out.println(new String(Base64.decodeBase64(data)));
    }
输出为:






  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在上一篇文章中,我们介绍了什么是URL重写和为什么要使用动态页面静态化。本文将进一步探讨如何使用URL重写将动态页面转换为静态页面。 1. 确定需要静态化的页面 通常情况下,我们会选择那些频繁访问、数据不经常更新的页面进行静态化,这样可以大幅度减少服务器压力,提高网站响应速度。 2. 编写URL重写规则 接下来,我们需要编写URL重写规则,将动态页面的URL转换为静态页面的URL。这里我们以Apache服务器为例,使用mod_rewrite模块来实现URL重写。 例如,我们要将动态页面http://www.example.com/article.php?id=1 转换为静态页面http://www.example.com/article/1.html,则可以使用以下规则: ``` RewriteEngine On RewriteRule ^article/([^/]*)\.html$ /article.php?id=$1 [L] ``` 这个规则的意思是:将以“/article/”开头、以“.html”结尾的URL请求重写为“/article.php?id=”后面接文章ID的形式。 3. 编写静态页面生成程序 重写URL只是第一步,我们还需要编写程序将动态页面生成为静态页面。这个程序可以是一个独立的脚本,也可以是在页面加载时自动执行的程序。 例如,我们可以在article.php页面中加入以下代码: ``` if(!file_exists("article/".$_GET['id'].".html")){ ob_start(); // 页面内容 $content = ob_get_contents(); ob_end_clean(); file_put_contents("article/".$_GET['id'].".html", $content); } ``` 这个程序的作用是:当访问article.php页面时,如果“/article/”后面的ID对应的静态文件不存在,则将页面内容缓存起来,并保存为“/article/”后面的ID对应的静态文件。 这样,当下一次访问同一页面时,服务器会直接返回静态页面,而不用再去执行动态页面生成的过程,从而提高网站响应速度。 4. 静态页面更新 由于静态页面不像动态页面那样能够自动更新,因此我们需要编写相应的程序来实现静态页面的更新。 例如,我们可以在article.php页面中添加以下代码: ``` if(file_exists("article/".$_GET['id'].".html")){ unlink("article/".$_GET['id'].".html"); } ``` 这个程序的作用是:当文章内容发生变化时,删除对应的静态文件,下一次访问该页面时会重新生成静态文件。 总结: 通过URL重写和动态页面静态化,可以大幅度提高网站的响应速度,减少服务器压力。但是需要注意的是,静态页面不适合频繁更新的内容,否则可能导致用户看到的内容与实际情况不

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值