【问题标题】:Why does HttpServletRequest.getRemoteAddr() with IPv6 address return extra characters为什么带有 IPv6 地址的 HttpServletRequest.getRemoteAddr() 返回额外的字符
【发布时间】:2015-10-16 10:56:31
【问题描述】:

在我的 Tomcat 托管 Web 应用程序中,doGet(...) 方法的前两行是:

String ip = request.getRemoteAddr();
System.out.println("ip = " + ip);

使用我们本地网络上的 IPv6 地址,它会输出:

ip = fe80:0:0:0:ac40:98cb:ca2e:c03c%4

最后的 %4 似乎无关紧要。它导致对我们的地理定位服务的请求失败。这个 %4 应该在那里吗?如果是这样,它意味着什么?有没有可靠的方法从没有 %4 的 HttpServletRequest 实例中获取 IPv6 地址?

【问题讨论】:

标签: java tomcat servlets ipv6


【解决方案1】:

这是scope ID。使用本机 API,在 java.net.InetAddressInet6Address#getScopeId() 的帮助下摆脱它的最佳选择如下:

String ip = request.getRemoteAddr();
InetAddress inetAddress = InetAddress.getByName(ip);

if (inetAddress instanceof Inet6Address) {
    Inet6Address inet6Address = (Inet6Address) inetAddress;
    int scopeId = inet6Address.getScopeId();

    if (scopeId > 0) {
        ip = inet6Address.getHostName().replaceAll("%" + scopeId + "$", "");
    }
}

这种笨拙是因为标准的java.net.Inet6Address API 没有任何方法可以返回没有范围 ID 的裸主机名。

另一方面,我想知道有问题的地理定位服务是否应该已经考虑到这一点。如果他们的 API 文档中甚至没有明确排除对 IPv6 范围的支持,那么我会在他们的问题跟踪器中提出问题。

【讨论】:

    猜你喜欢
    • 2012-06-16
    • 2018-03-30
    • 2010-12-18
    • 2012-08-28
    • 1970-01-01
    • 2020-02-24
    • 2022-08-19
    • 2016-12-11
    • 2023-03-23
    相关资源
    最近更新 更多