编程笔记

编程笔记

html5获取用户登录地址以及访问公网ip
2025-01-29

ip-api 免费IP

IP地址查询

https://whois.pconline.com.cn/ipJson.jsp?json=true


如果你访问https://whois.pconline.com.cn你就会发现会有很多说明

只获取ip

https://ipv4.ipw.cn/api/ip/locate


获取ip后后面的事情就简单了,可以通过ip获取到对应的省市区

pom.xml

        <!--ip2region-->
        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>1.7.2</version>
        </dependency>

首先你需要一个ip2region.db文件,大家可以百度一下,下面是我找到的csdn下载地址,需要的可以私信我

https://download.csdn.net/download/asn4513/20629211?spm=1001.2014.3001.5501

代码实现:

import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;

import java.io.File;

/**
 * @author ys
 * @version 1.0
 * @date 2023/2/7 13:43
 */
public class getPublicIp {


    /**
     * 根据IP获取地址
     *
     * @return 国家|区域|省份|城市|ISP
     */
    public static String getAddress(String ip) {
        return getAddress(ip, DbSearcher.BTREE_ALGORITHM);
    }

    /**
     * 根据IP获取地址
     *
     * @param ip
     * @param algorithm 查询算法
     * @return 国家|区域|省份|城市|ISP
     * @see DbSearcher
     * DbSearcher.BTREE_ALGORITHM; //B-tree
     * DbSearcher.BINARY_ALGORITHM //Binary
     * DbSearcher.MEMORY_ALGORITYM //Memory
     */
    @SneakyThrows
    public static String getAddress(String ip, int algorithm) {
        if (!Util.isIpAddress(ip)) {
//            log.error("错误格式的ip地址: {}", ip);
            return "";
        }
        //https://download.csdn.net/download/asn4513/20629211?spm=1001.2014.3001.5501
        String dbPath = "D:\\ip2region.db";
        File file = new File(dbPath);
        if (!file.exists()) {
//            log.error("地址库文件不存在");
            return "";
        }
        DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath);
        DataBlock dataBlock;
        switch (algorithm) {
            case DbSearcher.BTREE_ALGORITHM:
                dataBlock = searcher.btreeSearch(ip);
                break;
            case DbSearcher.BINARY_ALGORITHM:
                dataBlock = searcher.binarySearch(ip);
                break;
            case DbSearcher.MEMORY_ALGORITYM:
                dataBlock = searcher.memorySearch(ip);
                break;
            default:
//                log.error("未传入正确的查询算法");
                return "";
        }
        searcher.close();
        return dataBlock.getRegion();
    }

    public static void main(String[] args) {
        String address = getAddress("119.129.118.190");
        System.out.println(address);
        String[] split = address.split("\\|");
        String city = "";
        for (String aSplit : split){
            if (aSplit.contains("市")){
                city = aSplit;//拿取市级名称
            }
            System.out.println(aSplit);
        }
        if (StringUtils.isBlank(city)){
            System.out.println("获取失败");
        }
    }
}

根据ip查询所在国家地区(代码)

参考博客:根据ip查询所在国家地区(国内外ip均适用)