URL 参数编码、传参特殊字符-escape、encodeURI、encodeURIComponent

问题描述

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 转义函数

有三个:

  • escape
  • encodeURI
  • encodeURIComponent

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

应用场景

适合:

  • 可以对汉字转码

  • 可对 特殊符号 转码,如:url参数有 + 号,先转码,然后后端就可以正常转码

例子

//不会对 + 转码
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将显示错误。

感谢:

https://www.cnblogs.com/Tracy-zdy/p/3822080.html

https://www.cnblogs.com/wwzhang/p/4707677.html