检索客户端请求 ip 地址

Jos*_*vin 7 javascript ip request node.js express

这篇文章不再是一个真正的问题;我只是想发布这个来帮助其他人在未来避免浪费时间。

目标:检索客户端 IP 地址并根据 IP 中的某些八位字节设置一些特定值。

我正在为我的公司开发一个 React Web 应用程序,需要支持三个设施。这三个位置当然存在于不同的地理区域,并且 IP 模式略有不同。

我需要根据来自客户端 IP 的八位字节值设置一些会话标识符。为此,我执行了以下步骤。

  1. 为用户设置快速路线以点击应用程序的首次访问。
  2. 获取客户端 IP 并存储在 const/var 中。
  3. 将 IP 字符串分解为"."
  4. 执行If/ThenSwitch以确定所需八位字节的值。
  5. 在匹配条件内设置一些会话/逻辑。

感谢 express,该req对象包含一个带有请求 IP 地址值的 ip 键。我们可以利用这个或其他一些第三方库来获取所需的信息。当然,有更好/更安全的方法可以做到这一点,但这是我研究和设置的一种简单方法。非常感谢社区帮助我解决了这个问题。

    apiRouter.route('/test')

    .get((req, res) => {
        const request_ip = req.ip;      // Returns string like ::ffff:192.168.0.1
        const ip_array = request_ip.split('.')      // Returns array of the string above separated by ".". ["::ffff:192","168","0","1"]

        // The switch statement checks the value of the array above for the index of 2. This would be "0"
        switch(ip_array[2]) {
            case('0'):
                res.json({'request-ip':ip_array, 'location':'Location A'});
                break;
            case('1'):
                res.json({'request-ip':ip_array, 'location':'Location B'});
                break;
            case('2'):
                res.json({'request-ip':ip_array, 'location':'Location C'});
                break;
            default:
                res.json({'request-ip':ip_array, 'location':'Default Location'});
        }

    })
Run Code Online (Sandbox Code Playgroud)

我的主要问题之一是我在本地笔记本电脑上进行开发。我的节点服务器在这里运行 express。我也试图从我的本地机器上获取我的请求 ip。这没有意义,因为我一直在"::1"作为我的请求 IP 返回。困惑,我做了很多研究,最后发现这是一个明显的PEBKAC问题。感谢这篇文章中的nikoss ,它在世界上都有意义。

Joe*_*ner 6

您可以通过从开放的 IP 获取此信息

https://api.ipdata.co/

fetch("https://api.ipdata.co")
  .then(response => {
    return response.json();
   }, "jsonp")
  .then(res => {
    console.log(res.ip)
  })
  .catch(err => console.log(err))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢乔。这也很有用,也是一个不错的选择! (2认同)
  • 仅供参考,ipdata.co 和 ipify.org 均被常用的广告拦截器/chrome 扩展程序拦截。 (2认同)

小智 6

这有效!

async componentDidMount() {
      
    const response = await fetch('https://geolocation-db.com/json/');
    const data = await response.json();
    this.setState({ ip: data.IPv4 })
    alert(this.state.ip)

}
Run Code Online (Sandbox Code Playgroud)

在 jsx 中使用它作为

{这个.state.ip}


ian*_*ian 5

即使指定了密钥,https://api.ipdata.co似乎也不再起作用了。我最终使用了 Ipify (打字稿):

private getMyIp() {
  fetch('https://api.ipify.org?format=json').then(response => {
    return response.json();
  }).then((res: any) => {
    this.myIp = _.get(res, 'ip');
  }).catch((err: any) => console.error('Problem fetching my IP', err))
}
Run Code Online (Sandbox Code Playgroud)

这是替代 IP 检索服务的一个很好的参考:https://ourcodeworld.com/articles/read/257/how-to-get-the-client-ip-address-with-javascript-only