You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

java.net.URI解析数字开头域名时不同构造函数表现不一致问题

结论

这个问题属于OpenJDK 已知的历史遗留缺陷,既不是你使用URI构造函数的方法错误,也不是Spring框架的问题。

差异原因说明

两个URI构造函数的host校验逻辑完全不同:

  1. 拆分参数的构造函数
    你调用的new URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)会对单独传入的host参数做严格的域名分段校验:它沿用了过时的RFC 1123规则,强制要求域名的每一个点分隔分段不能以数字开头,你的hostmy-host.1domain里的1domain正好是数字开头的分段,直接触发了URISyntaxException。
    对应的报错代码如下:

    // 抛出异常
    new URI("http", /*userInfo*/null, /*host*/"my-host.1domain", 1234, "/path", /*query*/null, /*fragment*/null);
    

    异常栈:

    Exception in thread "main" java.net.URISyntaxException: Illegal character in hostname at index 15: http://my-host.1domain:1234/path
        at java.base/java.net.URI$Parser.fail(URI.java:2974)
        at java.base/java.net.URI$Parser.parseHostname(URI.java:3517)
        at java.base/java.net.URI$Parser.parseServer(URI.java:3358)
        at java.base/java.net.URI$Parser.parseAuthority(URI.java:3277)
        at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3219)
        at java.base/java.net.URI$Parser.parse(URI.java:3175)
        at java.base/java.net.URI.<init>(URI.java:708)
    
  2. 传入完整authority的构造函数
    new URI(String scheme, String authority, String path, String query, String fragment)不会对host做单独的分段规则校验,仅会检查是否存在通用非法字符,因此可以正常解析你传入的host。
    对应可正常运行的代码如下:

    // 可正常解析
    new URI("http", /*authority*/"my-host.1domain:1234", "/path", /*query*/null, /*fragment*/null);
    
背景补充

DNS域名规则早在RFC 3696中就已经放宽了限制,允许域名分段以数字开头,但JDK的URI实现一直没有更新对应的校验逻辑,该问题在多个JDK版本中长期存在。Spring官方将相关issue标记为非Spring侧问题的处理是合理的。

临时规避方案
  • 手动构造URI时,优先使用传入完整authority参数的构造函数,避开过时的host分段校验
  • 若使用Spring UriComponentsBuilder触发该问题,可以手动构造完整的authority字符串传入构建器,或者在构建UriComponents后先调用encode方法再转换为URI。

内容的提问来源于stack exchange,提问作者hertzsprung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:54:04