首页 文章

IPv6环回地址http:// 0:0:0:0:0:0:0:1 - 浏览器无法连接 . 方法getRemoteHost()

提问于
浏览
2

方法 String domain = request.getRemoteHost(); 返回 0:0:0:0:0:0:0:1 IPv6地址 . LAN卡配置为支持IPv6协议,Firefox也是如此: network.dns.disableIPv6 false ,并且安装了Java 1.8.0_141-b15 64位 . 但是如果我输入 http://0:0:0:0:0:0:0:1 它会显示错误或在Google上显示结果(??) . 如果我输入 localhost127.0.0.1 ,它会显示我项目的网页 . 怎么修好?我的目标不是禁用IPv6,而是支持IPv4和IPv6协议 .

建议的解决方案是添加括号: http://[0:0:0:0:0:0:0:1] . 它正在发挥作用 . 但现在我们必须手动添加括号,并且只有协议是IPv6 . 也许应该更新 getRemoteHost() 以更好地支持IPv6?

我在网络资源标识符_2541374中找到了有关文字IPv6地址的信息:

IPv6地址中的冒号(:)字符可能与已 Build 的资源标识符语法冲突,例如URI和URL . 传统上,冒号一直用于在端口号之前终止主机路径 . [8]为了缓解这种冲突,文字IPv6地址用方括号括在这些资源标识符中,例如:http:// [2001:db8:85a3:8d3:1319:8a2e:370:7348] /
当URL还包含端口号时,符号为:https:// [2001:db8:85a3:8d3:1319:8a2e:370:7348]:443 /

所以看来Java问题......?现在正在研究IPv6正则表达式..

2 回答

  • 0

    如果您向Java询问主机名,您将获得主机名,而不是URI片段 . 没有什么不妥 . 如果你真的想要一个URI,你应该要求一个URI:

    String host = "::1", path = "/";
    URI uri = new URI("http", host, path, null);
    System.out.println("URI: " + uri);
    

    将打印

    URI: http://[::1]/
    

    但是,如果您手动构造URI字符串,则在必要时添加括号将是您的责任 .

  • 3

    找到一个简单的解决方

    public static boolean isIPv6(String IP) throws UnknownHostException {
        InetAddress address = InetAddress.getByName(IP);
        return address instanceof Inet6Address;
    }
    

    但是有一个方法 getRemoteHost(true | false) 来获取带有括号的IPv6地址是非常好的 .

相关问题