Get请求传参,与编码解码

@1 Get请求流程:

在get请求中,参数直接添加在了url后面,同url一起提交到服务器。

常用的url参数的格式为:

http://ip:port/path/file?参数1=值1&参数2=值2….
多个参数之间使用&分割,参数与值之间使用=分割

例如:
http://localhost:8080/http/test?p1=zhangsan&p2=18

服务器端Servlet通过 req.getParameter(“参数名”)就可以获取相应参数的值。


@2 问题的产生

这是正常的使用情况,我们需要考虑某些特殊情况,如下:

假如p1参数的值是 “zhang&san”,那么url地址变为:
http://localhost:8080/http/test?p1=zhang&san&p2=18

这时,我们通过req.getParameter(“p1”)获取到的值为“zhang”,而不是我们想要的“zhang&san”,

这该怎么办呢,URL机制该如何应对类似的这种情况呢?


@3 解决问题-1 URL编码过程

为了防止这种情况发生,URL规定(RFC1738草案),在通过URL进行网络访问时,
需要将URL参数中的特殊字符进行URL编码。

这里面涉及到两个问题:

1 哪些字符是特殊字符

2 编码的时候如何进行编码

第一个问题:
除了大小写字母、数字、-_.(横线下划线小数点)这三类字符之外的字符,均为特殊字符

第二个问题:
特殊字符进行编码时分为两个步骤,
1:
特殊字符需要按照一定的编码格式(gbk或utf-8)转换为byte数组 (ISO-8859-1),
如,在gbk编码格式下 :
; 对应[3B]
& 对应[26]
%对应[25]
马对应[C2,ED]
经过第一步 ;&%马对应的字节序列变为 [3B,26,25,C2,ED]

2:
将第一步生成的byte数组,每个byte前添加%号,生成URL编码后的字符串
于是:
[3B,26,25,C2,ED]
转换为
%3B%26%25%C2%ED

这就是URL编码的过程,以及最终生成的编码后字符串。

在编写程序时,我们可以调用方法(或js中的function)来帮我们完成这个编码过程:
java中:java.net.URLEncoder(源URL,‘编码格式’);
js中:encodeUrIComponent(源URL);

这里需要注意的一点是,对于特殊字符空格“ ”,在通过URLEncoder编码时,不会编码成%20,(空格对应的ascii为0x20),而是会编码成“+”加号。这一点与 URL规定(RFC1738草案)中描述的不同。
但是这并不影响我们的使用,只要在解码时,按照这个规则进行解码就行了。


@3 解决问题-2 URL解码过程

web容器(以Tomcat为例)在接收到用户的Get请求后,会解析http请求报文,根据报文内容与服务器的环境,生成request对象,发送给Servlet处理。

服务器的环境,就是当前服务器的一些配置信息,其中重要的一项就是“默认编码格式”,
以tomcat8为例,默认编码格式为utf-8。

在servlet中,我们可以通过req.getParameter(“参数名”);来获取对应参数的值,这里要注意该调用背后的工作:
1:
在第一次调用该方法时,tomcat会将queryString按照&和=号进行分割成一个个的键值对,
然后对各个键和它对应的值进行url解码,string str = URLDecoder.decode(键/值,“tomcat编码格式”);,
这样,之前经过url编码的键/z值,又回归到了原本的模样。(解码的过程与编码过程相反)。
然后,解析该字符串,获取参数名和参数值(键值对),放入request对象的parameterMap中。
2:
第二步根据参数名,查找parameterMap,返回参数值。

这里需要注意的是,
1、按照URL规定(RFC1738草案),%20会解码为空格;按照encode方案,+号也会被解码为空格,所以%20和+号,均会被解码为空格。
2、解码过程会出现错误,此时该参数的值为null,
如,queryString为“name=3&age=3%3+&size=8”,这样在decode时参数age的值3%3+不满足解析的规则(%号后需要两位16进制数);那么age参数的值为null,name和size的值不受影响。

所以,对于get请求,对url中参数进行URLDecode的工作,tomcat帮助我们做了,解码时采用的编码格式为tomcat默认的编码格式,当然我们也可以通过配置文件,修改默认编码。


最后有几点需要声明:
1:
如果decode时的编码格式与encode时不同,那么参数就会出现中文乱码的问题。

2:
在浏览器地址栏中输入地址,浏览器在发起http请求时,并不会自动帮你将特殊字符进行encode,造成这个假象的原因是,他会将空格和中文字符,按照“utf-8”编码格式进行urlencode,其他特殊字符,它是不管的。

Get请求与URL编码解码相关推荐

  1. java url加密解密,java URL 编码解码,该如何解决

    java URL 编码解码 我写了两个接口 一个是对字符串加密 的,一个是解密的  .加密的可以通过调用接口生成加密字符串如下: Oc0PEwKrLzHqT25hYLhWP5wlk5HROPJoWC3 ...

  2. 编码解码--url编码解码

    url编码解码,又叫百分号编码,是统一资源定位(URL)编码方式.URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通 ...

  3. URL编码解码工具类

    /****************************************************************************** * CREATETIME : 2016年 ...

  4. URL编码/解码详解

    URL编码/解码详解 当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式).URL 编码的原则是使用安全字符去表示那些不安全的字符. 安全字符 ...

  5. 使用python对url编码解码

    最近在抓取一些js代码产生的动态数据,需要模拟js请求获得所需用的数据,遇到对url进行编码和解码的问题,就把遇到的问题总结一下,有总结才有进步,才能使学到的知识更加清晰.对url进行编码和解码,py ...

  6. python request url编码_Python爬虫进阶——Request对象之Get请求与URL编码【英雄联盟吧】...

    在上一篇中,我们是通过urllib.request.urlopen直接访问的网页地址,但在实际应用中,我们更多地使用urllib.request.Request对象,因为其可以封装headers和da ...

  7. python3 url 编码 解码

    对于url编码的转换,主要用urllib.parse包中的quote和unquote方法. quote进行编码,unquote进行解码. 代码实例: import urllib.parseu = &q ...

  8. 利用百度进行URL编码解码

    以后大家在碰到解析URL编码的时候就不用在从网上下载工具了 利用百度就可以了哈 是这样的 http://www.baidu.com/s?wd=("="号后面输入你要解码的URL编码 ...

  9. PHP和javascript中url编码解码详解

    在实际开发中,我们可能会遇到路径编码解码的问题,下面总结了一下: PHP中: 1.urlencode(编码),urldecode(解码) $a = urlencode('http://www.baid ...

最新文章

  1. gen_event中的handler和supervised handler
  2. Python中的生产者与消费者模式(转载)
  3. 江西教育考试院2021年高考成绩查询入口,2021年江西高考网上志愿填报入口:江西省教育考试院...
  4. Go 的 flag 包可以解析命令行的参数
  5. 英特尔软件学院与中国一起迎接2008
  6. echarts中x轴文字过长换行处理和倾斜处理。
  7. linux 跨物理 集群,linux学习之使用keepalived结合lvs搭建高可用负载均衡集群
  8. mysql 自连接 临时表_存储过程中表(table)的自连接及临时表示例 (自认为好的存储过程示例)...
  9. iapp如何导入本地源码,iapp导入源码使用教程
  10. Axure9(基础二)
  11. 华为eSight网络监控平台安装-最新版本
  12. Jmeter配置元件之HTTP授权管理器与 HTTP缓存管理器-19
  13. 网页P2P加速视频解析dplayer播放器源码(带记忆播放功能)
  14. 【Educational Codeforces Round 61 (Rated for Div. 2) D.Stressful Training】二分
  15. 怎样将好多个字符串组装成一个数组
  16. PPASR语音识别(进阶级)
  17. Day29 - Countdown Timer
  18. 信息安全导论 实验四 RSA算法(不要求支持大数)
  19. python中的整数
  20. Core Bluetooth框架之一:Central与Peripheral

热门文章

  1. 常见的HR SaaS系统都有哪几种类型?
  2. 二叉树的两节点的最远距离
  3. 解压命令linux tgz,linux常用压缩解压命令:tar,tgz,gzip,zip,rar
  4. DB2中cursor的使用举例
  5. 魅族账号退出服务器繁忙,白忙活!小米魅族微博抢热度,结果还是不敌荣耀这一招...
  6. Linux:find命令简单使用(查找文件及文件夹)
  7. KTV里的那些唱歌姿势
  8. jQuery文件上传
  9. 【Docker】Dockerfile构建镜像与命令详解
  10. Python计算工具