gpt4 book ai didi

java - 为什么具有 IPv6 地址的 HttpServletRequest.getRemoteAddr() 会返回额外的字符

转载 作者:行者123 更新时间:2023-11-30 06:57:55 37 4
gpt4 key购买 nike

在我的 Tomcat 托管网络应用程序中,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 地址?

最佳答案

这是scope ID .使用 native API,在 java.net.InetAddress 的帮助下,摆脱它的最佳选择如下所示和 Inet6Address#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 范围的支持,那么我会在他们的问题跟踪器上提交问题。

关于java - 为什么具有 IPv6 地址的 HttpServletRequest.getRemoteAddr() 会返回额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168783/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com