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

时间:2017-08-04 21:56:19

标签: http firefox java-8 ipv6

方法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?

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

  

IPv6地址中的冒号(:)字符可能与   已建立的资源标识符语法,例如URI和URL。该   冒号传统上用于在a之前终止主机路径   端口号。[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 :(得分:3)

如果您向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字符串,那么你的责任是在必要时添加括号。

答案 1 :(得分:0)

找到一个简单的解决方案:

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

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