方法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上显示结果(??)。如果我输入localhost
或127.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正则表达式..
答案 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地址是非常好的。