java-实现通过IP地址查询归属地的功能

前文:

  • 通过解析IP地址,返回该IP地址对应国名、身份/一级行政区、地级市/二级行政区、网络运营商(移动、联通、电信)。

效果图如下:

在这里插入图片描述

例子如下:

public static void main(String[] args) {
    String ipAddress = "IP地址";
    AttributionVo detail = IPUtil.getCityInfo(ipAddress);
    System.out.println("输入的IP为:" + ipAddress + ",返回的结果为:" +detail);
}
  • 工具类IPUtil,java:
package com.alex.examples.entity;

import com.alex.examples.vo.AttributionVo;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;
import org.springframework.util.ResourceUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Method;

public class IPUtil {

    /**
     * 获取IP地址
     *
     * @param request
     * @return
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if ("0:0:0:0:0:0:0:1".equals(ip)) {
            ip = "127.0.0.1";
        }
        if (ip.split(",").length > 1) {
            ip = ip.split(",")[0];
        }
        return ip;
    }

    /**
     * 根据IP地址获取城市
     *
     * @param ip
     * @return
     */
    public static AttributionVo getCityInfo(String ip) {
        AttributionVo vo = new AttributionVo();
        File file = null;
        try {
            Integer systemType = isSystemType();
            if (systemType == 0) {
                file = ResourceUtils.getFile("classpath:ip2region.db");
            }
            if (systemType == 1) {
                file = ResourceUtils.getFile("/home/caixiaojiong/jar/ip2region.db");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (!file.exists()) {
            System.out.println("Error: Invalid ip2region.db file, filePath:" + file.getPath());
            return vo;
        }
        //查询算法
        int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
        //DbSearcher.BINARY_ALGORITHM //Binary
        //DbSearcher.MEMORY_ALGORITYM //Memory
        try {
            DbConfig config = new DbConfig();
            DbSearcher searcher = new DbSearcher(config, file.getPath());
            Method method;
            switch (algorithm) {
                case DbSearcher.BTREE_ALGORITHM:
                    method = searcher.getClass().getMethod("btreeSearch", String.class);
                    break;
                case DbSearcher.BINARY_ALGORITHM:
                    method = searcher.getClass().getMethod("binarySearch", String.class);
                    break;
                case DbSearcher.MEMORY_ALGORITYM:
                    method = searcher.getClass().getMethod("memorySearch", String.class);
                    break;
                default:
                    return null;
            }
            DataBlock dataBlock;
            if (!Util.isIpAddress(ip)) {
                System.out.println("Error: Invalid ip address");
                return vo;
            }
            dataBlock = (DataBlock) method.invoke(searcher, ip);
            String[] result = dataBlock.getRegion().split("\\|");
            vo.setNationName(result[0]);
            vo.setProvince(result[2]);
            vo.setCity(result[3]);
            vo.setOperator(result[4]);
            return vo;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static boolean isLinux() {
        return System.getProperty("os.name").toLowerCase().contains("linux");
    }

    public static boolean isWindows() {
        return System.getProperty("os.name").toLowerCase().contains("windows");
    }

     /**
     * 判断当前系统是windows系统还是linux系统
     *
     * @return
     */
    public static Integer isSystemType() {
        Integer isSystemType = 0;
        boolean isWindows = isWindows();
        if (isWindows) { //是windows系统
            isSystemType = 0;
            return isSystemType;
        }

        boolean isLinux = isLinux();
        if (isLinux) { //是linux系统
            isSystemType = 1;
            return isSystemType;
        }

        return isSystemType;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值