url编码与解码
1 概述
最近写sky-takeout,将其中的oss换成了minio,本来万事顺利,但是测试的时候发现删除功能无法生效,对象文件一直好好的保存着,怎么删都删不掉!一开始我一直以为是删除权限的问题,但是网上一直搜索,总是得不到答案。最后才发现,原来万恶之源是URL编码!我的数据库中存储的是文件预览的路径,也就是url路径,这个路径中的特殊字符就是被编码过的,所以我将它解码之后再传入,得以成功删除!(说来也巧了,我之前测试的文件都是带有特殊字符的)
2 为什么url要编码
URL(统一资源定位符)编码是一种互联网标准,用于在URL中表示可能不被允许或有特殊意义的字符。URL编码的主要目的包括:
- 兼容性:URL中只允许使用一小部分字符,主要是字母、数字和一些特殊符号(如
-
、_
、.
、!
、~
、*
、'
、(
、)
)。其他字符,如空格、标点符号、特殊符号等,如果直接使用,可能会导致URL解析错误或被误解。 - 安全性:URL编码可以防止注入攻击,如SQL注入,通过将特殊字符编码,可以确保这些字符在传输过程中被正确处理,而不是被解释为控制字符。
- 数据完整性:在URL中传输数据时,如查询参数,编码可以确保数据在传输过程中不被修改。例如,空格在URL中通常被解释为参数分隔符,如果不进行编码,可能会导致数据被错误地解析。
- 国际化:URL编码支持国际化字符,允许在URL中包含非ASCII字符,如中文、日文等,这对于全球化的互联网环境非常重要。
URL编码通常使用百分比编码(Percent-encoding),也称为URL编码。在这种编码方式中,非允许的字符被替换为%
后跟两位十六进制数,表示字符的ASCII码。例如,空格被编码为%20
。
3 哪些需要编码
-
ASCII 控制字符- 通常用于输出控制的不可打印字符。字符范围 00-1F 十六进制(0-31 十进制)和 7F(127 十进制)。下面给出了一个完整的编码表。
-
非 ASCII 字符- 这些字符超出 128 个字符的 ASCII 字符集。
-
保留字符- 这些是特殊字符,例如美元符号$、与号&、加号+、普通、正斜杠/ \、冒号:、分号;、等号=、问号?和“@”符号等。所有这些在 URL 中可能有不同的含义,因此需要进行编码。
-
不安全字符- 这些是空格、引号、小于符号、大于符号、磅字符、百分比字符、左花括号、右花括号、管道、反斜杠、插入符号、波浪号、左方括号、右方括号、重音. 由于各种原因,这些字符可能会在 URL 中被误解。这些字符也应始终进行编码。
4 Java接口进行编码解码
在Java中,可以使用java.net.URLEncoder
和java.net.URLDecoder
类来对URL进行编码和解码。这些类提供了静态方法来处理URL中的字符编码问题。
4.1 URL 编码
URL编码通常用于将URL中的查询字符串参数转换为适合在URL中传输的格式。例如,空格字符在URL中通常被替换为加号(+)或百分号编码(%20)。
示例代码:
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class URLEncodingExample {
public static void main(String[] args) {
try {
String url = "http://example.com/search?";
String query = "这是一个测试";
// 编码查询参数
String encodedQuery = URLEncoder.encode(query, "UTF-8");
String fullUrl = url + "query=" + encodedQuery;
System.out.println("Encoded URL: " + fullUrl);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
4.2 URL 解码
URL解码用于将编码后的URL转换回原始格式。这通常在从URL中提取参数时使用。
示例代码:
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class URLDecodingExample {
public static void main(String[] args) {
try {
String encodedUrl = "http://example.com/search?query=%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95";
String decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
System.out.println("Decoded URL: " + decodedUrl);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}