Ip2region - 一个神奇的归属地查询库

Ip2region - 一个神奇的归属地查询库

浮梦 126 2023-10-26

Ip2region - 一个神奇的归属地查询库

前言

大家好,又是我叼毛,我很久都用这个库了,他们说准确率达到了99.9%,但是他们的文章都是复制粘贴的,很没意思,温馨提示就是说不会很官方的讲解这个Ip2region库,因为我是一个码农,所以更讲究一个使用方法,而不是研究原理,如果说想研究原理的,请绕道,OK,接下来直接上教程。

安装

首先就是安装,这个库支持c,c#,golang,java,lua,lua_c,nginx,nodejs,php,python以及rust,这边就讲PHP、Java的安装方法吧。

PHP通过composer安装

composer require zoujingli/ip2region

Java的pom文件增加

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.7.0</version>
</dependency>

使用方法

PHP的使用方法

OK不多废话啊,既然我们已经安装好了库,我们直接用就行了。

<?php
require 'Ip2Region.php';
$ip2region = new \Ip2Region();
$result = $ip2region->simple('127.0.0.1');
print_r($result);

PHP的就这么简单,new一个Ip2Region的对象,然后调用simple方法,simple方法传参是IP就行了,如果说,你不会获取用PHP获取用户IP地址的话,那么好,我去给你找个文章复制下!

<?php
require 'Ip2Region.php';
// 这是PHP获取IP地址的方法,如果没有获取到正确的ip,那么他返回的就是unkonw,注意,如果说你只是用这个方法获取IP地址的话,那么就没必要要上面的require了,上面是为了引入ip2region的,准备下面的结合使用哈!一定注意!!!不会就评论问!!!
function getClientIp() {
	$ip = 'unknow';
    foreach (array(
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP',
                'HTTP_FORWARDED_FOR',
                'HTTP_FORWARDED',
                'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return $ip;
}
// 至于怎么结合用呢?请看代码
$ip2region = new \Ip2Region();
$ip = getClientIp();
// $result返回是对象哈,看不懂对象啥意思,他的类型是Array,OK,代码演示完毕。
$result = $ip2region->simple($ip);
print_r($result);

Java的使用办法

该到使用Java代码的时候了,这次我先张贴出来获取IP的方法,同样,我这么好的人,肯定帮你们找好了,直接复制粘贴哈,别跟我客气,等会写,有点麻烦,我怕我写的你看不懂,我先把Java的放到这,你先看获取ip的方法,Java的等我想起来再更新博客

// package 自己加,我怕有人问我,为啥报错

import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpUtil {
    private static final String UNKNOWN = "unknown";
    // 看过来看过来,走一走看一看,getIpAddress这个方法就是获取ip的方法。
    public static String getIpAddress(HttpServletRequest request) {
        String ip = null;
        try {
            // k8s将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
            ip = request.getHeader("X-Original-Forwarded-For");
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("X-Forwarded-For");
            }
            // 通过nginx获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("x-forwarded-for");
            }
            // 通过Apache代理获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            // 通过WebLogic代理获取ip
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            // 通过负载均衡获取IP地址(HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR)
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            // 通过Nginx获取ip(Nginx中的另一个变量,内容就是请求中X-Forwarded-For的信息)
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            //兼容集群获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
                // 客户端和服务器为同一台机器时,获取的地址为IPV6格式:"0:0:0:0:0:0:0:1"
                if ("127.0.0.1".equalsIgnoreCase(ip) || "0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)) {
                    //根据网卡取本机配置的IP
                    InetAddress iNet = null;
                    try {
                        iNet = InetAddress.getLocalHost();
                        ip = iNet.getHostAddress();
                    } catch (UnknownHostException e) {
            			System.out.println("获取IP地址异常 "+e);
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("获取IP地址异常 "+e);
        }
        //使用代理,则获取第一个IP地址
        if (!StringUtils.isEmpty(ip) && ip.indexOf(",") > 0) {
            ip = ip.substring(0, ip.indexOf(","));
        }
        return ip;
    }
}