精华内容
下载资源
问答
  • 2021-04-28 02:03:10

    今天在写项目掉接口的时候有一个接口需要到了用户的ip地址,查了半天觉得这个方法不错,也不要引入第三方的插件。我自己觉得还不错,就记下来以备不时之需

    首先在data里添加一个ip为空

    data() {

    return {

    ip: ''

    };

    }

    然后在methods里面写上

    getUserIP(onNewIP) {

    let MyPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;

    let pc = new MyPeerConnection({

    iceServers: []

    });

    let noop = () => {

    };

    let localIPs = {};

    let ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g;

    let iterateIP = (ip) => {

    if (!localIPs[ip]) onNewIP(ip);

    localIPs[ip] = true;

    };

    pc.createDataChannel('');

    pc.createOffer().then((sdp) => {

    sdp.sdp.split('\n').forEach(function (line) {

    if (line.indexOf('candidate') < 0) return;

    line.match(ipRegex).forEach(iterateIP);

    });

    pc.setLocalDescription(sdp, noop, noop);

    }).catch((reason) => {

    });

    pc.onicecandidate = (ice) => {

    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;

    ice.candidate.candidate.match(ipRegex).forEach(iterateIP);

    };

    }

    最后在mounted里面调用在methods里面的那个方法getUserIP()

    this.getUserIP((ip) => {

    this.ip = ip;

    });

    这样this.ip就是用户当前的ip地址了

    对了,有的浏览器获取到的是IPv4地址,有的是IPv6地址

    更多相关内容
  • java 获取用户ip

    2017-10-25 23:57:42
    获取访问者ip地址,123456789012345678901234567890123456789
  • JSP 获取用户的真实IP两种实现方法详解 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP...
  • 主要介绍了Python使用django获取用户IP地址的方法,实例分析了django获取用户IP地址过程中出现的问题与对应的解决方法,非常简单实用,需要的朋友可以参考下
  • 在php中自带了一个非常的简单的获取IP地址的全局变量,很多初学都获取IP都使用它了,但是对于这些我们一般用法是满足了,但是对于要求高精度这个函数还是不行的。 这个是最简单的方法,对于开了透明代理之类的是没有...
  • 主要介绍了python使用Flask框架获取用户IP地址的方法,实例分析了Python使用Flask框架remote_addr获取IP的技巧,非常具有实用价值,需要的朋友可以参考下
  • 淘宝公布了他们的IP库http://ip.taobao.com/,还有REST API接口,不过每个用户的访问频率需小于10qps,访问方 式:http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串],返回内容以json格式的。具有IP查询...
  • thinkphp框架中系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 除了thinkphp内置get_client_ip函数外,也可使用下面函数获取客户端IP地址。 $type表示返回类型 0 返回IP...
  • 主要介绍了Java根据Request获取客户端IP的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 获取本地ip,mac地址

    2018-11-09 15:41:03
    C#简单编写的一个获取本地ip,mac地址的小程序,C#简单编写的一个获取本地ip,mac地址的小程序
  • 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户IP,这个方法简单、快速、实用 。 我们调用它的写法是: [removed][removed] 它可以返回用户IP和地点,比喻: var IPData = new Array(220....
  • 在论坛中闲逛,无意中发现腾讯的ip接口。还是挺有意思的。大家可以利用下,这个IP接口所查询到的还是比较准确,我发给几个朋友测试了一下都是正确的,毕竟是腾讯的东西。
  • GLB下部署的Sanic应用获取用户ip

    千次阅读 2021-11-28 20:24:48
    前情提要 最近要把给部署的机器都...升级完之后,在测试的时候却发现,request.remote_addr不能像往常一样获取客户端IP了,经过一番折腾,终于搞定。 环境 我们的应用架构较为简单,GLB --> Nginx --> Sa

    前情提要

    最近要把给部署的机器都升级,从Debian9升级到Debian10. Debian9的默认python版本是python3.5,而Debian10的默认版本是python3.7,为了部署方便和日后升级,我把要部署的Sanic应用也从python3.5升级到python3.7了。

    升级完之后,在测试的时候却发现,request.remote_addr不能像往常一样获取客户端IP了,经过一番折腾,终于搞定。

    环境

    我们的应用架构较为简单,GLB --> Nginx --> Sanic.

    • GLB:Google Load Balancing. 谷歌的全球范围的负载均衡器,我们通过GLB,来进行路由转发、流量分发到相应的backend。每个backend是一个实例组,实例组下面有若干个VM实例(VM,既虚拟机)。

    • Nginx:不多说。每个实例运行Nginx进行机器内部的负载均衡,把流量分发到机器内部的若干个Sanic进程

    • Sanic:一个python高性能web异步框架,框架特性开箱即用,无需像Flask一样需要部署Gunicone 或者uWISG之类的Web Server。此时升级是从 Sanic 19.3.1升级到Sanic==21.6.0

      Nginx 配置如下

          location / {
              proxy_pass_header Server;
              proxy_set_header Host $http_host;
              proxy_redirect off;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Scheme $scheme;
      ​
              real_ip_header    X-Forwarded-For;
              real_ip_recursive on;
              proxy_pass http://backend_hosts;
              proxy_http_version 1.1;
              proxy_set_header Connection "";
          }

      正文

      源码解析

      查看Sanic源码,发现从 Sanic 19.3.1升级到Sanic==21.6.0后,request.remote_addr代码有所更改。

      remote_addr

      # Sanic 19.3.1
      @property
      def remote_addr(self):
          """Attempt to return the original client ip based on X-Forwarded-For.
          :return: original client ip.
          """
          if not hasattr(self, "_remote_addr"):
              forwarded_for = self.headers.get("X-Forwarded-For", "").split(",")
              remote_addrs = [
                  addr
                  for addr in [addr.strip() for addr in forwarded_for]
                  if addr
              ]
              if len(remote_addrs) > 0:
                  self._remote_addr = remote_addrs[0]
              else:
                  self._remote_addr = ""
          return self._remote_addr
      # Sanic 21.6.0
          @property
          def remote_addr(self) -> str:
              """
              Client IP address, if available.
              1. proxied remote address `self.forwarded['for']`
              2. local remote address `self.ip`
      ​
              :return: IPv4, bracketed IPv6, UNIX socket name or arbitrary string
              :rtype: str
              """
              if not hasattr(self, "_remote_addr"):
                  self._remote_addr = str(
                      self.forwarded.get("for", "")
                  )  # or self.ip
              return self._remote_addr

      从源码看来,在19.3.1版本获取ip时,是直接从http header获取X-Forwarded-For字段,并且如果X-Forwarded-For里面存在多个ip,取第一个。而升级到了21.6.0的时候,则多了一些处理。

      forwarded

          @property
          def forwarded(self) -> Options:
              """
              Active proxy information obtained from request headers, as specified in
              Sanic configuration.
      ​
              Field names by, for, proto, host, port and path are normalized.
              - for and by IPv6 addresses are bracketed
              - port (int) is only set by port headers, not from host.
              - path is url-unencoded
      ​
              Additional values may be available from new style Forwarded headers.
      ​
              :return: forwarded address info
              :rtype: Dict[str, str]
              """
              if self.parsed_forwarded is None:
                  self.parsed_forwarded = (
                      parse_forwarded(self.headers, self.app.config)      # 注释1
                      or parse_xforwarded(self.headers, self.app.config)  # 注释2
                      or {}
                  )
              return self.parsed_forwarded

      注释1是从http header的forwarded字段解析, forwarded可以简单理解成X-Forwarded-For, X-Forwarded-Host,X-Forwarded-Proto的结合体,我们结合GLB下的使用,通过X-Forwarded-ForX-Real-Ip获取客户端ip。

      parse_xforwarded

      def parse_xforwarded(headers, config) -> Optional[Options]:
          """Parse traditional proxy headers."""
          real_ip_header = config.REAL_IP_HEADER
          proxies_count = config.PROXIES_COUNT
          addr = real_ip_header and headers.getone(real_ip_header, None)
          if not addr and proxies_count:
              assert proxies_count > 0
              try:
                  # Combine, split and filter multiple headers' entries
                  forwarded_for = headers.getall(config.FORWARDED_FOR_HEADER)
                  proxies = [
                      p
                      for p in (
                          p.strip() for h in forwarded_for for p in h.split(",")
                      )
                      if p
                  ]
                  addr = proxies[-proxies_count]
              except (KeyError, IndexError):
                  pass
          # No processing of other headers if no address is found
          if not addr:
              return None
            
          def options():
              yield "for", addr
              for key, header in (
                  ("proto", "x-scheme"),
                  ("proto", "x-forwarded-proto"),  # Overrides X-Scheme if present
                  ("host", "x-forwarded-host"),
                  ("port", "x-forwarded-port"),
                  ("path", "x-forwarded-path"),
              ):
                  yield key, headers.getone(header, None)
      ​
          return fwd_normalize(options())

      看到这里突然发现多了config.REAL_IP_HEADERconfig.PROXIES_COUNT这两个东西。到官网一看才发现,Sanic基于安全考虑,在后面升级的版本,也就是在("19.3.1", "20.6.0")这两个版本的中间的版本加入了这个功能:反向代理后的服务必须要设置如下一项或多项 配置, 才能正常获取用户ip,以防止一些恶意客户端可能会使用代理头来隐藏自己的 IP。

      • FORWARDED_SECRET

      • REAL_IP_HEADER

      • PROXIES_COUNT

        测试

        测试代码如下:

        @app.route("/")
        async def index(request):
            logging.info(request.headers)
            logging.info(request.remote_addr)
            return sanic.response.text("Ok")

        通过X-Forwarded-For获取

        在启动参数加入以下

        app.config.PROXIES_COUNT = 2

        结果如下:

        INFO [2021-11-28 11:15:07,597][16889][root] <Header('host': 'xxx.com', 'x-real-ip': '35.190.xx.xx','x-scheme': 'http', 'user-agent': 'curl/7.64.1', 'accept': '*/*',  'x-forwarded-for': '113.118.xxx.xxx, 35.190.xx.xx', 'x-forwarded-proto': 'https')>
        INFO [2021-11-28 11:15:07,597][16889][root] 113.118.xxx.xxx

        通过X-Real-IP获取

        在启动参数加入以下

        app.config.REAL_IP_HEADER = "X-Real-IP"

        结果如下:

        INFO [2021-11-28 11:35:36,176][18851][root] <Header('host': 'test.roiquery.com', 'x-real-ip': '35.190.xx.xx', 'x-scheme': 'http', 'user-agent': 'curl/7.64.1', 'accept': '*/*', 'x-cloud-trace-context': '62fee86592b6df1704b808585d1098b8/4774134022823104383', 'via': '1.1 google', 'x-forwarded-for': '113.118.x x x.xxx, 35.190.xxx.xxx', 'x-forwarded-proto': 'https')>
        INFO [2021-11-28 11:35:36,176][18851][root] 35.190.xx.xx

        发现问题,request.remote_addr获取到的ip是GLB的ip。为什么呢?

        理解这个问题首先要知道Nginx配置里面的几个常用配置的含义

        proxy_set_header X-Real-IP $remote_addr;
        real_ip_header    X-Forwarded-For;                        
        real_ip_recursive on;
        • proxy_set_header X-Real-IP $remote_addr;

          $remote_addr表示Nginx获取到的用户ip,并把ip放到http header的X-Real-IP字段里,传到下一端。在我们的架构中,Nginx上一层是GLB

        • real_ip_header X-Forwarded-For;

          是指从接收到报文的哪个http首部去获取前代理传送的用户ip。参考GLB文档,GLB会把客户端ip和GLB自身ip设置到http header的X-Forwarded-For里。

        • real_ip_recursive on;

          If recursive search is disabled, the original client address that matches one of the trusted addresses is replaced by the last address sent in the request header field defined by the real_ip_header directive. If recursive search is enabled, the original client address that matches one of the trusted addresses is replaced by the last non-trusted address sent in the request header field.

          当real_ip_recursive为off时,nginx会把real_ip_header指定的HTTP头中的最后一个IP当成真实IP,当real_ip_recursive为on时,

          nginx会把real_ip_header指定的HTTP头中的最后一个不是信任服务器的IP当成真实IP。在我们的测试场景下,X-Forwarded-For值为'113.118.x x x.xxx, 35.190.xxx.xxx'。

        那什么是信任服务器呢?这就得提到另外一个配置:set_real_ip_from

        • set_real_ip_from

          Defines trusted addresses that are known to send correct replacement addresses.

          定义已知可发送正确替换地址的可信地址。有些拗口,大概的意思是告诉Nginx,这个配置的ip不是真正的用户ip,这个ip的服务器是信任的服务器。

          也就是说,其实在我这次测试场景中,real_ip_recursive 不管是off还是on,最终获取的ip都是35.190.xx.xx。因为35.190.xxx.xxx是最后一个ip。而当我把以下配置加上

          set_real_ip_from 35.190.00.00/16;

        最终结果如下

        INFO [2021-11-28 12:10:41,205][16889][root] <Header('host': 'xxx.com', 'x-real-ip': '113.118.xxx.xxx','x-scheme': 'http', 'user-agent': 'curl/7.64.1', 'accept': '*/*',  'x-forwarded-for': '113.118.xxx.xxx, 35.190.xx.xx', 'x-forwarded-proto': 'https')>
        INFO [2021-11-28 12:10:41,205][16889][root] 113.118.xxx.xxx

        总结

        获取ip的这个两种方式的区别就不说了,大伙儿按需选择,网上众说纷云,稍微查下就有答案。

        参考链接:

        目录

        前情提要

        环境

        Nginx 配置如下

        正文

        源码解析

        remote_addr

        forwarded

        parse_xforwarded

        测试

        总结


    展开全文
  • 主要介绍了js如何获取访问IP、地区、当前操作浏览器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache、Squid、nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下
  • Thinkphp 获取用户IP

    千次阅读 2020-02-04 03:52:36
    Thinkphp 获取用户IP php获取客户端IP地址有四种方法,这五种方法分别为 REMOTE_ADDR HTTP_CLIENT_IP HTTP_X_FORWARDED_FOR HTTP_VIA REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名...

    Thinkphp 获取用户IP

    php获取客户端IP地址有四种方法,这五种方法分别为

    REMOTE_ADDR
    HTTP_CLIENT_IP
    HTTP_X_FORWARDED_FOR
    HTTP_VIA

    REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。

    HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。

    $_SERVER[‘REMOTE_ADDR’]; //访问端(有可能是用户,有可能是代理的)IP

    $_SERVER[‘HTTP_CLIENT_IP’]; //代理端的(有可能存在,可伪造)

    $_SERVER[‘HTTP_X_FORWARDED_FOR’]; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

    一、没有使用代理服务器的情况:

    REMOTE_ADDR = 您的 IP
    HTTP_VIA = 没数值或不显示
    HTTP_X_FORWARDED_FOR = 没数值或不显示

    二、使用透明代理服务器的情况:Transparent Proxies

    REMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

    三、使用普通匿名代理服务器的情况:Anonymous Proxies

    REMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

    四、使用欺骗性代理服务器的情况:Distorting Proxies

    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

    五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 没数值或不显示
    HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

    六、获取客户端真实的IP地址实例:
    function get_real_ip(){
        $ip=FALSE;
        //客户端IP 或 NONE 
        if(!empty($_SERVER["HTTP_CLIENT_IP"])){
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }
        //多重代理服务器下的客户端真实IP地址(可能伪造),如果没有使用代理,此字段为空
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
            for ($i = 0; $i < count($ips); $i++) {
                if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
                    $ip = $ips[$i];
                    break;
                }
            }
        }
        //客户端IP 或 (最后一个)代理服务器 IP 
        return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }
    
    展开全文
  • node.js获取用户IP地址

    2021-10-11 10:32:49
    // 获取客户端ip地址 app.get('/ip', function (req, res) { var clientIp = getIp(req) console.log('客户端ip',clientIp) res.json({'youIp':clientIp}); }) //通过req的hearers来获取客户端ip var getIp = ...
    // 获取客户端ip地址
    app.get('/ip', function (req, res) {
      var clientIp = getIp(req)
      console.log('客户端ip',clientIp)
      res.json({'youIp':clientIp});
    })
    //通过req的hearers来获取客户端ip
    var getIp = function(req) {
      var ip = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddres || req.socket.remoteAddress || '';
      if(ip.split(',').length>0){
        ip = ip.split(',')[0];
      }
      return ip;
    };
    
    展开全文
  • Django request.META(获取用户ip) request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所...
  • 在这过程中列举了不知道多少个解决方案,但是最后选择通过用户IP进行标识,当然其中还进行了其它的一些逻辑处理的,在这儿只谈如何使用Java语言通过HttpServletRequest获取用户IP地址,可以拿来即用哦。 分段代码...
  • 获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,...但是我们尽量使用比较完善的方法获取客户ip,下面小编给大家分享PHP获取用户客户端真实IP的方法,一起看看吧
  • 如何通过request对象获取用户IP地址

    千次阅读 2021-01-19 18:14:12
    获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 正向代理是客户端(google.com),反向...
  • C#实现获取多网卡IP地址方法,该方法可以遍历出所有网卡的IP地址。
  • 前端获取用户 IP 地址

    千次阅读 2020-10-15 17:43:18
    // 请求 soho 接口, 返回值如下: // var returnCitySN = {"cip": "120.228.1.183", "cid": "CN", "cname": "CHINA"};... // session储存 IP 地址,需要的时候再用 sessionStorage.setItem("userIp.
  • 主要为大家详细介绍了PHP获取用户访问IP地址的5种方法,感兴趣的小伙伴们可以参考一下
  • 主要介绍了Java获取用户访问IP及地理位置的方法,结合实例形式详细分析了Java基于百度地图开放平台获取用户访问IP及地理位置相关操作技巧,需要的朋友可以参考下
  • 车牌号需要选择省,为了方便用户操作,所以想自动定位默认省,如下图: 我查询了一些博客,找到了一些方法,经过测试,记录一下还能用的。 方法一:搜狐API 有时候cname这个字段返回的不是省市,因为在2/3/4G...
  • 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家、省、市和运营商。 淘宝IP地址库http://ip.taobao.com提供了IP区域信息的查询,并提供了接口 补充:其实还有一个隐蔽的...
  • ![图片说明](https://img-ask.csdn.net/upload/201904/08/1554705500_165231.png) 现在红框里获取用户登录ip,... 我在登录的contrllor获取用户ip是正确的,打印的就是我同事的ip,但是在拦截器中就变成我本地的ip了。
  • vue获取服务端IP用户IP

    千次阅读 2022-03-11 17:19:08
    在vue中获取用户IP,并传给后端 背景 由于公司功能需要,要在axios发送请求时将访问者的ip地址放在头部传递 步骤 第一步:需要修改 chrome 浏览器的配置: 1、在chrome 浏览器地址栏中输入:chrome://flags/ 2、搜索...
  • 微信小程序获取用户Ip地址

    千次阅读 2020-04-01 14:27:01
    wx.request({ url: 'https://pv.sohu.com/cityjson?ie=utf-8', success(res){ var m = JSON.parse(res.data.match(/.*(\{[^\}]+\}).*/)[1] || '{}') console.log('ip =>', m.cip, m...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593,367
精华内容 237,346
关键字:

如何获取用户ip