【问题标题】:Can't get IP from HttpServletRequest if using "localhost" URL如果使用“localhost”URL,则无法从 HttpServletRequest 获取 IP
【发布时间】:2013-01-06 08:02:35
【问题描述】:

我在尝试从 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 吗?有什么操作系统?试试127.0.0.1:8443/test/main.html
  • 我的操作系统是 ubuntu,我不确定我的机器是否启用了 IPV6

标签: java jakarta-ee servlets


【解决方案1】:

你的方法的结果是绝对正确的。 我假设您收到的号码是0:0:0:0:0:0:0:1。它是环回地址的有效形式。 但它只是 IPv6 格式的 localhost。 localhost的IPv4地址是127.0.0.1,而localhost的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 地址。”如何在浏览器中进行设置?
【解决方案2】:

为什么不试试

request.getRemoteAddr()

只有?您真的需要原始 IP 地址(“X-Forwarded-For”提供的那个)吗?我猜有时查看一些愚蠢的 LAN 地址而不是可寻址资源(由上层方法提供)是没有用的。

后期编辑:

看看这个问题:Finding user ip address 似乎已修复。

【讨论】:

  • 如果网络有中间节点,getRemoteAddress() 不会为您提供客户端的 IP 地址。对于代理和负载平衡器尤其如此。
  • 你说得对,这就是我在答案中添加编辑的原因。 OP 可以从那里检查正确答案。
猜你喜欢
  • 2020-11-04
  • 2020-02-11
  • 2016-11-08
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2011-02-21
  • 2021-12-26
相关资源
最近更新 更多