检索客户端请求 ip 地址

Posted

技术标签:

【中文标题】检索客户端请求 ip 地址【英文标题】:Retrieving the client request ip address 【发布时间】:2018-08-21 19:13:46 【问题描述】:

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

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

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

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

    设置快速路由,方便用户首次访问应用。 获取客户端 IP 并存储在 const/var 中。 用"."分解IP字符串。 执行 If/ThenSwitch 以确定所需八位字节的值。 在匹配条件下设置一些会话/逻辑。

感谢 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');
        

    )

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

【问题讨论】:

你的主要目标是找到用户的位置而不是获取他们的 ip? 不,在这种情况下找到请求IP更重要。我可以使用一些 GeoLocator 库,我认为这就是你的意思。我想我可以使用 google api 来定位,但我只需要一个简单的解决方案来设置一些特定于站点的详细信息。谢谢乔。 没关系,我建议只使用 navigator.geolocation.getCurrentPosition 但如果您需要可以理解的 IP 感谢乔的快速建议。这虽然有用,但在这种情况下 IMO 并不理想。一个很好的替代选择! 我已经回答了我认为如果你需要一个 codepen 让我知道这将是最简单/最好的解决方案 【参考方案1】:

您可以通过从开放 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))

【讨论】:

谢谢乔。这也很有用,也是一个不错的选择! 仅供参考,ipdata.co 和 ipify.org 都被常用的广告拦截器/chrome 扩展程序拦截。【参考方案2】:

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

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

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

【讨论】:

仅供参考,ipdata.co 和 ipify.org 都被常用的广告拦截器/chrome 扩展程序拦截。【参考方案3】:

这行得通!

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)


在jsx中用作

this.state.ip

【讨论】:

仅供参考,ipdata.co 和 ipify.org 都被常用的广告拦截器/chrome 扩展程序拦截。【参考方案4】:

如果https://api.ipdata.co 不起作用,您可以使用geolocation-db.com/json。地理位置的优势它还为您提供了其他重要值,例如 latitude, longitude, country, state, zip

fetch(`https://geolocation-db.com/json/`)
    .then(res => res.json())

你可以console.log(...)res.json()查看JSON值。

【讨论】:

此网址提供的地理位置数据不准确

以上是关于检索客户端请求 ip 地址的主要内容,如果未能解决你的问题,请参考以下文章

php PHP - 检索客户端IP地址的高级方法

服务端如何获取客户端请求IP地址

Jersey REST 客户端请求 - 如何设置源 IP 地址

C#用Socket怎么得到请求客户端的IP地址

Java 获取客户端请求IP地址(公网ip)

Java 获取客户端请求IP地址(公网ip)