问题描述
url传特殊字符,如果不做处理,后端java获取不到参数
例子
url参数如下:
https://www.malaoshi.top/search.jsp?title=++
java无法通过 request 对象获取参数:
String s=request.getParameter("title");
System.out.println(s);
解决
前端: 需要用 javascript 的 escape、encodeURI、encodeURIComponent 函数 对 参数 编码
后端: 一般可通过 request.getParameter 直接获取参数,不需要做额外处理。如果需要处理,可用 URLDecoder
URL编码
URL 编码,就是指 将 url 中的 特殊符号 做转义处理
| 符号 | 解释 | 转义 |
|---|---|---|
| # | 用来标志特定的文档位置 | %23 |
| % | 对特殊字符进行编码 | %25 |
| & | 分隔不同的变量值对 | %26 |
| + | 在变量值中表示空格 | %2B |
| / | 表示目录路径 | %2F |
| \ | 表示目录路径 | %5C |
| = | 用来连接键和值 | %3D |
| ? | 表示查询字符串的开始 | %3F |
| 空格 | 空格 | %20 |
| . | 句号 | %2E |
| : | 冒号 | %3A |
JavaScript 转义函数
有三个:
escapeencodeURIencodeURIComponent
escape()【不推荐】
采用 ISO Latin 字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成 %xx 格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。
比如,空格符对应的编码是 %20 。
不编码的字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
特殊
escape对0-255以外的 unicode值进行编码时输出 %u**** 格式,与 encodeURI、encodeURIComponent 编码格式不同
例子
console.log(escape("++"))
console.log(escape("结构体"))
执行结果:
++
%u7ED3%u6784%u4F53
unescape
解码
encodeURI()【一般推荐】
把URI字符串采用 UTF-8 编码格式转化成 escape 格式的字符串。
不编码的字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
应用场景
适合:可以对汉字转码
不适合: 有 特殊符号 转码,如:url有 + 号,后端转码会发生错误
缺点例子
//不会对 + 转码
console.log(encodeURI("++"))
//可以对 汉字 转码
console.log(encodeURI("结构体"))
结果:
++ // 如果将 + 发给后端,后端(java)解码时,会将 + 转成空格
%E7%BB%93%E6%9E%84%E4%BD%93
后端转码
后端转码:
- 使用 URLDecoder 类解码
- 设置 UTF-8 编码
// 这里的 ++ ,就是从前端传过来的
String s = URLDecoder.decode("++", "UTF-8");
System.out.println(s);
执行结果:
// 将 ++ 转码成 2 个空格
encodeURIComponent()【推荐】
把URI字符串采用 UTF-8 编码格式转化成 escape 格式的字符串。
不编码的字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
应用场景
适合:
例子
//不会对 + 转码
console.log(encodeURIComponent("++"))
//可以对 汉字 转码
console.log(encodeURI("结构体"))
结果:
%2B%2B // 发给后端,后端(java)解码时,会将 %2B%2B 转成 ++
%E7%BB%93%E6%9E%84%E4%BD%93 // 汉字
后端转码
后端转码:
- 使用 URLDecoder 类解码
- 设置 UTF-8 编码
// 这里的 %2B%2B ,就是从前端传过来的
String s = URLDecoder.decode("%2B%2B", "UTF-8");
System.out.println(s);
执行结果:
++ // 将 %2B%2B 转码成之前的 ++
与encodeURI()相比
encodeURIComponent 可以对 更多的字符 进行编码,比如 / 等字符。
所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。
感谢:

