获取客户端请求的IP地址

11

这篇文章不再是一个问题,我只是想发布它以帮助其他人避免浪费时间。

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

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

我需要根据客户端IP的某个字节值设置一些会话标识符。为此,我采取了以下步骤。

  1. 为用户在应用程序的初始访问上设置express路由。
  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'});
        }

    })

我的主要问题之一是我在本地电脑上开发。我的node服务器正在这里运行express。我还试图从本地机器获取我的请求IP。这没有意义,因为我不断收到"::1"作为我的请求IP。经过大量研究后,我终于发现这是一个明显的PEBKAC问题。感谢这篇文章中的nikoss,一切都变得清晰了。


你的主要目标是查找用户位置,而不是获取他们的IP吗? - Joe Warner
不,这种情况下找到请求的IP更重要。我可以使用一些GeoLocator库,我想这就是你的意思吧。我猜我可以使用谷歌API来获取位置,但我只需要一个简单的解决方案来设置一些特定于网站的细节。谢谢Joe。 - Josiah Colvin
没问题,我本来想建议你只使用navigator.geolocation.getCurrentPosition,但如果你需要IP也可以理解。 - Joe Warner
谢谢你的快速建议,乔。虽然有用,但在我看来,在这种情况下并不理想。不过,这是一个很好的替代选项! - Josiah Colvin
不用担心 :) 祝你有一个愉快的一天 - Joe Warner
显示剩余2条评论
5个回答

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))

2
谢谢Joe。这也很有用,是个不错的选择! - Josiah Colvin
2
FYI,ipdata.co和ipify.org都被常用的广告拦截器/Chrome扩展程序所阻止。 - JimmyTheCode

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)

}

use it in jsx as

{this.state.ip}


5
似乎 https://api.ipdata.co 不再工作,即使指定了密钥也是如此。 我最终使用了 Ipify(typescript):
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))
}

这是一个关于替代IP获取服务的好参考资料:https://ourcodeworld.com/articles/read/257/how-to-get-the-client-ip-address-with-javascript-only

FYI,ipdata.co和ipify.org都被常用的广告拦截器/Chrome扩展程序所屏蔽。 - JimmyTheCode

-1
如果 https://api.ipdata.co 无法使用,您可以使用 geolocation-db.com/json。使用地理位置的优点是它还提供其他重要值,如 纬度、经度、国家、州、邮编
fetch(`https://geolocation-db.com/json/`)
    .then(res => res.json())

你可以使用 console.log(...) 来输出 res.json() 的 JSON 值。

2
该URL提供的地理位置数据不准确。 - Rik van Velzen

-4

你也可以使用这个。

fetch('https://get-ip-only.herokuapp.com/') .then(r => r.json()) .then(resp => console.log(resp.ip))

https://get-ip-only.herokuapp.com/ 该API仅提供IP地址。


不起作用,不是可靠的答案。 - omzer

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