问题
url中的参数里,除了字母、数字以及".","-","*" 和 "_"这些字符外,其他符号(空格、汉字等)会被认为是不安全字符,因此在传参时需要对参数进行转码,转码后的特殊字符数据是一个或多个十六进制的转义序列。
js转码
js使用JavaScript全局函数 encodeURIComponent。
var basicStr = '123 ABC+-456你好DEF'
var encodeStr = encodeURIComponent(basicStr)
console.info(basicStr)
console.info(encodeStr)
执行结果:
123 ABC+-456你好DEF
123%20ABC%2B-456%E4%BD%A0%E5%A5%BDDEF
Java转码
Java语言使用 java.net.URLEncoder 包里的静态方法 encode。
public static void main(String[] args) throws UnsupportedEncodingException {
String basicStr = "123 ABC+-456你好DEF";
System.out.println(basicStr);
String encodeStr = URLEncoder.encode(basicStr, "UTF-8");
System.out.println(encodeStr);
}
执行结果:
123 ABC+-456你好DEF
123+ABC%2B-456%E4%BD%A0%E5%A5%BDDEF
这里留意一下,js函数把空格替换为"%20",而Java方法把空格替换为"+"号,它们都是代表空格。
测试
使用转码出来的字符串作为url中的参数请求接口:
/testParam?data=123%20ABC%2B-456%E4%BD%A0%E5%A5%BDDEF
后台接口代码
@ResponseBody
@GetMapping("/testParam")
public Object testParam(String data) {
try {
log.info(data);
return "success";
} catch (Exception e) {
return "fail";
}
}
控制台结果:
123 ABC+-456你好DEF