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;
}
}