如果使用"localhost" URL,无法从HttpServletRequest获取IP

3

我在尝试从HttpServletRequest中获取IP时遇到了问题,请先看我的代码:

String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip; 

我的问题是,如果使用以下URL打开应用程序(我的PC的URL为18.111,服务器部署在本地主机上)“https://192.168.18.111:8443/test/main.html”,我可以通过以上代码获取正确的URL。但是,如果使用“https://localhost:8443/test/main.html”打开,则会返回类似“0.1.0.1....”的内容。为什么这个函数对“localhost”无效?或者有没有更好的方法从HttpServletRequest获取IP地址?

0.1.0.1?哇,没有127.0.0.1?你的机器启用了IPv6吗?你用的是什么操作系统?尝试使用https://127.0.0.1:8443/test/main.html。 - ggrandes
我的操作系统是Ubuntu,我不确定是否已经在我的机器上启用了IPV6。 - Chailie
2个回答

7
您的方法结果是绝对正确的。我假设您得到的数字是0:0:0:0:0:0:0:1,这是一个有效的环回地址形式。但它只是IPv6格式下的本地主机地址。本地主机的IPv4地址为127.0.0.1,IPv6地址为0:0:0:0:0:0:0:1
问题在于URL https://localhost:8443/test/main.html默认匹配IP协议的两个版本。显然,您的浏览器选择使用IPv6。
为了进行本地测试,请尝试使用文字地址127.0.0.1而不是名称localhost。或者您可以将DNS设置中仅保留IPv4地址。

好的,明白了。但是针对这个问题,“您可以在DNS设置中仅使用IPv4地址。”如何进行设置?需要在浏览器中吗? - Chailie

1
为什么不试试呢?
request.getRemoteAddr()

只需要原始IP地址吗(由“X-Forwarded-For”提供的地址)?我猜有时看到一些愚蠢的LAN地址而不是可寻址资源并不有用 - 上述方法提供了解决方案。

后续编辑:

看看这个问题:查找用户IP地址,似乎已经解决了。


如果网络中存在中间节点,getRemoteAddress()无法提供客户端的IP地址。这对于代理和负载均衡器尤其如此。 - kapandron
你说得对,这就是为什么我在我的回答中添加了一个编辑。原帖的作者可以从那里查看正确的答案。 - Ariel Chelsău

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接