java学习-http中get请求的非ascii参数如何编码解码探讨
# 背景:
看着别人项目代码看到一个PathUtils工具类,
里面只有一个方法,String rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中因为中文乱码导致程序异常
上面的方法的用处是,获取到项目配置文件的路径,通过 rebuild 方法返回解码后的路径。
# 疑惑:
由于我不清楚Path变量是怎么样的情况,为什么要经过rebuild方法过滤一遍
就想测试下,如果是正常中文进行解码,解码后的字符串还是一样的吗?
String newPath = "Keywords=湿答答";
try {
newPath = URLDecoder.decode(newPath, "UTF-8");
System.out.println(newPath);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
结果中文没有发生变化。
接着我查看的 URLDecoder的decode方法, + 号和 % 开头的字符串才会进行解码
note:这里的编码解码也称 %百分号编码解码
# 深入学习:
接着,用百度搜索的下 “urldecoder 编码和解码”
发现url编码解码主要是应用于发送 http 的 get 请求时,对特定字符串进行编码,后台服务器会对get请求的url进行解码,以保证网络传输过程中数据的正常。
看到一篇文章 不同浏览器中URL的编码方式
不同浏览器对编码字符的编码方式是不同的,
如IE浏览器可以设置编码的方式

可以设置是否发送utf-8格式的url
浏览器对URL编码方式不一样可能会导致我们后台获取到的数据是错误的。
浏览器编码方式有gbk,utf-8,等等,
假设:浏览器使用gbk的编码方式编码中文参数。我们后台服务器接收到后会进行utf-8解码,因为解码方式不一样,就导致我们获取到的参数是乱码的
为了避免这个问题我们需要自己对get请求的参数进行url编码。
为什么要自己主动对参数进行编码呢,需要先大概看下编码解码过程
注意:url编码解码也称 %百分号编码解码
编码过程:
字母,特殊用户字符(/,:@-_.等。即斜杠,逗号,点,冒号,横线,下划线等)
会被直接跳过,不会进行编码处理,
其他的所有字符都要经过%xx编码处理。
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
编码方法很简单,在该字节ascii码的的16进制字符前面加%
如 空格字符,ascii码是32,对应16进制是'20',那么urlencode编码结果是 %20
由于JavaScript使用的是Unicode编码,也就是utf-8编码,所以编码函数也是使用utf-8编码,
所以js的encodeURI函数,编码中文,‘爱’ 是三个字节,编码后 %e7%88%b1 ,这3个十六进制就代表,爱
解码过程:
解码是编码的逆向,对匹配到的百分号编码进行反向解码,字母和特殊字符也会被跳过。java中会对+号字符进行特殊处理,直接用空格替换。
上面的编码和解码有一个值得注意的地方,浏览器不会对 + 号进行编码,而tomcat或jetty服务器会将这个加号使用空格替换。
如下面的get请求
http://localhost:8080/api/test?aa=zhang+san&p2=18
我们java中使用request.getParameter("aa")方法获取到的aa参数的值是zhang san
+ 号被替换成的空格
这是一种情况,用户输入,跟我们获取到的数据不一致
还有一种情况,服务器是以 & 符号进行分割参数的,如果我们把上面+号替换成&
http://localhost:8080/api/test?aa=zhang&san&p2=18
我们获取到aa的值是zhang
服务器会认为这个get请求有三个参数,以 & 为分隔符
分别是
aa=zhang
san=
p2=18
为了避免以上问题,我们都不应该让浏览器对参数进行编码,而是我们自己做编码
java学习-http中get请求的非ascii参数如何编码解码探讨的更多相关文章
- java学习-get和post请求
摘要 看完本文可以知道,使用java原生编写get/post请求的步骤,进行网络请求时应该注意的地方. 这里使用java自带的HttpUrlConnection对象进行网络请求, 请求步骤大致分为五步 ...
- ajax请求参数中含有特殊字符"#"的问题 (另附上js编码解码的几种方法)
使用ajax向后台提交的时候 由于参数中含有# 默认会被截断 只保留#之前的字符 json格式的字符串则不会被请求到后台的action 可以使用encodeURIComponent在前台进行编码, ...
- 简单测试Java线程安全中阻塞同步与非阻塞同步性能
摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...
- java学习(更新中)
class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...
- Java学习笔记之——this关键字、非静态成员属性和静态成员属性的区别、类的加载顺序
一.this关键字 1.代表当前类的对象 2.通过” . ”调用成员属性和成员方法 3.通过this可以区分成员属性和参数 参数名和属性名相同的情况,默认是参数名 二.非静态成员属性和静态成员属性的区 ...
- java 获取request中的请求参数
1.get 和 post请求方式 (1)request.getParameterNames(); 获取所有参数key后.遍历request.getParameter(key)获取value (2)re ...
- Java学习——方法中传递参数分简单类型与复杂类型(引用类型)编程计算100+98+96+。。。+4+2+1的值,用递归方法实现
package hello; public class digui { public static void main(String[] args) { // TODO Auto-generated ...
- 如何用java发送Http的post请求,并传递参数
书写方法,请参考以下代码: package utils; import java.io.BufferedReader; import java.io.IOException; import java. ...
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...
随机推荐
- Chapter14 糖酵解 糖异生 戊糖途径
糖酵解 一. 1.总览 产生丙酮酸 产生两个ATP 产生两个NADH 丙酮酸的去路: 产生乙醇 产生乳酸 乙酰辅酶A 参与其他合成 2.氧化磷酸化和之后的底物水平磷酸化是一个藕联过程 3.能量存在丙酮 ...
- 20155326刘美岑2016-2017-2《Java程序设计》第一周学习总结
20155326刘美岑 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 在老师的要求下我看了这门课的考察方式.这门课和以前上的课有些差别,成绩是由平时一点一点 ...
- cnn公式推导
CNN公式推导 1 前言 在看此blog之前,请确保已经看懂我的前两篇blog[深度学习笔记1(卷积神经网络)]和[BP算法与公式推导].并且已经看过文献[1]的论文[Notes on Convolu ...
- 彻底卸载Oracle database 12c教程
1.WIN+R,然后输入regedit,回车:2.在注册表中,进入目录:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,删除所有以oracl ...
- cad2018卸载/安装失败/如何彻底卸载清除干净cad2018注册表和文件的方法
cad2018提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2018失败提示cad2018安装未完成,某些产品无法安装,也有时候想重新安装cad2018 ...
- phpMyadmin提权那些事
i春秋作家:anyedt phpMyadmin提权那些事 引言:在渗透测试过程中获知到phpMyadmin的账号密码,如何进行提权呢?往下看,我今天和你说说phpMyadmin提权那些事. 0×00 ...
- 利用Python做绝地科学家(外挂篇)
i春秋作家:奶权 前言 玩吃鸡时间长的鸡友们 应该都知道现在的游戏环境非常差 特别在高端局 神仙满天飞 搞得很多普通玩家非常没有游戏体验 因为吃鸡的火爆 衍生出了一条巨大的外挂利益链 导致市面上出 ...
- nginx-https错误
连接 ssl.acfun.tv 时发生错误. SSL 接收到一个超出最大准许长度的记录. (错误码: ssl_error_rx_record_too_long) 最后发现,是因为nginx里的配置包含 ...
- 【Spark算子】:reduceByKey、groupByKey和combineByKey
在spark中,reduceByKey.groupByKey和combineByKey这三种算子用的较多,结合使用过程中的体会简单总结: 我的代码实践:https://github.com/wwcom ...
- Liferay-Activiti 功能介绍 (新版Liferay7基本特性)
一句话简介 Liferay是世界领先的开源企业门户(也可作为综合门户),是最强大(没有之一)的JAVA开源门户,在Gartner和Forrester和评价非常高,近几年已经超越了微软门户Sharepo ...