211209-Java使用URI.create()注意事项

文章目录
  1. 一灰灰的联系方式

记录一个在实际使用过程中遇到的问题,在解析一个url格式的字符串中的域名时,直接使用下面这种姿势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static ImmutablePair</**host*/String, /**uri*/String> foramtUri(String uri) {
// uri中空格去除,避免转换异常
URI u = URI.create(uri);
String host = u.getHost();
if (u.getPort() > 0 && u.getPort() != 80) {
host = host + ":80";
}

String baseUri = u.getPath();
if (u.getFragment() != null) {
baseUri = baseUri + "#" + u.getFragment();
}

if (StringUtils.isNotBlank(baseUri)) {
baseUri = host + baseUri;
} else {
baseUri = host;
}

return ImmutablePair.of(host, baseUri);
}

正常使用上面这种进行解析,没啥问题,结果某天突然抛了个异常

1
2
3
4
5
public static void main(String[] args) {
String url = "https://spring.hhui.top/spring-blog/2021/08/31/210831-SpringBoot系列之Mybatis CURD基本使用姿势-注解篇/";
ImmutablePair<String, String> ans = foramtUri(url);
System.out.println(ans);
}

直接抛出了异常

1
2
3
4
5
6
Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in path at index 74: https://spring.hhui.top/spring-blog/2021/08/31/210831-SpringBoot系列之Mybatis CURD基本使用姿势-注解篇/
at java.net.URI.create(URI.java:852)
at com.git.hui.story.common.URIUtil.foramtUri(URIUtil.java:15)
at com.git.hui.story.common.URIUtil.main(URIUtil.java:37)
Caused by: java.net.URISyntaxException: Illegal character in path at index 74: https://spring.hhui.top/spring-blog/2021/08/31/210831-SpringBoot系列之Mybatis CURD基本使用姿势-注解篇/
at java.net.URI$Parser.fail(URI.java:2847)

从异常提示上可以很清楚看到,根源在于非法的字符,但是从肉眼上看,并没有什么问题啊,没有什么特殊字符,也没有表情符,讲道理不应该存在问题啊

首先观察url字符串,特殊点多半在于空格了,去掉之后再试一下,发现居然成功了;

接下来问题来了,什么样的字符在通过URI.create转换时会认为是非法的呢?

  • 空格
  • 引号
  • 尖括号: 引号和尖括号通常用于在普通文本中起到分隔Url的作用
  • #: 对于#需要注意为止,不能出现在域名中
  • %
  • {}|\^[]~`

上面这个方法的基本诉求比较简单,就是获取域名,所以可以直接解析域名的方式来解决,当然也可以针对上面的特殊字符进行替换处理来避免这个问题

从根本上来说,关键在于不要出现这种不满足uri规范的数据才是真理

一灰灰的联系方式

尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

QrCode

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×