【问题标题】:Make Java report a IPv6 address insted of IPv4使 Java 报告 IPv6 地址而不是 IPv4
【发布时间】:2017-06-24 23:30:21
【问题描述】:

对于 Java 项目,我使用用户 IP 地址作为网站的唯一标识符。当用户只有 IPv4 地址时,一切正常。

但这是我的问题,当用户拥有 IPv6 地址时,Java 将报告 IPv4 地址,而他们的浏览器将报告 IPv6 地址(在 PHP 中的 $_SERVER['REMOTE_ADDR'] 调用中)。

那么我如何让 Java 报告它是 IPv4 的 IPv6 地址?

编辑:一些澄清:

这仅用于允许一个人下载文件。几个人使用同一台电脑没关系,不是很重要。

假设用户使用 chrome 访问http://whatismyipaddress.com/,它将显示 IPv6 地址。

但如果我现在使用 Java 来获取 http://whatismyipaddress.com/,它将显示 IPv4 地址。为什么会这样?如何让它显示 Chrome 中显示的 IPv6 地址?

编辑2:我使用的代码

public static String get(String url) throws WebFetchException {
    String result = "";
    try {
            URL url1 = new URL(url);
            HttpsURLConnection urlConn = (HttpsURLConnection) url1.openConnection();
            urlConn.setConnectTimeout(8 * 1000);
            urlConn.setRequestMethod("GET");
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
            String text;
            while ((text = in.readLine()) != null) {
                result = result + text;
            }
            in.close();
        }
    } catch (Exception e) {
        throw new WebFetchException("There was an exception while fetching the requested page: " + url);
    }
    return result;
}

【问题讨论】:

  • 首先,IP 地址不是(完全)唯一的标识符。为什么不只存储 IP - 无论是 ipv4 还是 ipv6? “Java 将报告 IPv4 地址”是什么意思?
  • 您的方案不适用于同一台机器上的多个用户。
  • 如何获取ip数据,是否使用特定类型?有代码吗?

标签: java php ipv6


【解决方案1】:

IP 地址可以用作标识符的假设是错误的。越来越多的 ISP 正在部署某种形式的 NAT,因此许多用户将共享一个 IPv4 评估池。用户来自的地址可以从一个连接更改为另一个连接,因此您不能依赖它是稳定的。

另一方面,更多的用户也使用 IPv6,并且设备有多个 IPv6 地址,这些地址会随着时间的推移而变化。

由于连接问题,用户也会在 IPv4 和 IPv6 之间切换。好吧,用户甚至不会注意到,他们的设备就会这样做。

所以依赖 IP 地址是行不通的。

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 2021-10-27
    • 2021-02-18
    • 2013-09-18
    • 1970-01-01
    • 2023-04-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多