当前位置: 首页 > news >正文

Java通过GeoLite2-City.mmdb 进行IP信息查询地理定位和经纬度筛选。

引入依赖

<dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>4.2.0</version>
</dependency>

下载数据文件:https://download.lin2ur.cn/GeoLite2/
在这里插入图片描述

package com.cqcloud.platform.utils;import java.io.File;
import java.net.InetAddress;
import com.maxmind.geoip2.DatabaseReader
import cn.hutool.core.lang.Console;
import lombok.experimental.UtilityClass;/*** @author weimeilayer@gmail.com ✨* @date 💓💕2024年7月4日 🐬🐇 💓💕*/
@UtilityClass
public class GeoLite2Utils {/**** @description: 获得国家* @param reader GeoLite2 数据库* @param ip ip地址* @return* @throws Exception*/public static String getCountry(DatabaseReader reader, String ip) throws Exception {return reader.city(InetAddress.getByName(ip)).getCountry().getNames().get("zh-CN");}/**** @description: 获得省份* @param reader GeoLite2 数据库* @param ip ip地址* @return* @throws Exception*/public static String getProvince(DatabaseReader reader, String ip) throws Exception {return reader.city(InetAddress.getByName(ip)).getMostSpecificSubdivision().getNames().get("zh-CN");}/**** @description: 获得城市* @param reader GeoLite2 数据库* @param ip ip地址* @return* @throws Exception*/public static String getCity(DatabaseReader reader, String ip) throws Exception {return reader.city(InetAddress.getByName(ip)).getCity().getNames().get("zh-CN");}/**** @description: 获得经度* @param reader GeoLite2 数据库* @param ip ip地址* @return* @throws Exception*/public static Double getLongitude(DatabaseReader reader, String ip) throws Exception {return reader.city(InetAddress.getByName(ip)).getLocation().getLongitude();}/**** @description: 获得纬度* @param reader GeoLite2 数据库* @param ip ip地址* @return* @throws Exception*/public static Double getLatitude(DatabaseReader reader, String ip) throws Exception {return reader.city(InetAddress.getByName(ip)).getLocation().getLatitude();}public static void main(String[] args) throws Exception {long startTime = System.currentTimeMillis();Console.log("--------------------------开始时间{}", startTime);// 创建 GeoLite2 数据库//Windows环境切换到自己的文件存放路径即可File file = new File("D:\\GeoLite2-City.mmdb");// 读取数据库内容DatabaseReader reader = new DatabaseReader.Builder(file).build();// 访问IPString ip = "218.70.71.0";String siteAddress = "国家:"+GeoLite2Utils.getCountry(reader, ip) + "\n省份:" + GeoLite2Utils.getProvince(reader, ip) + "\n城市:" + GeoLite2Utils.getCity(reader, ip)+ "\n经度:" + GeoLite2Utils.getLongitude(reader, ip)+ "\n纬度:" + GeoLite2Utils.getLatitude(reader, ip);Console.log(siteAddress);long endTime = System.currentTimeMillis();Console.log("--------------------------结束时间 {} 耗时 {} 毫秒", endTime, endTime - startTime);}
}

运行结果

--------------------------开始时间1720080983354
国家:中国
省份:重庆
城市:重庆市
经度:106.5577
纬度:29.5689
--------------------------结束时间 1720080983436 耗时 82

然后作为判断的 创建 GeoIPChecker

import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.Country;
import com.maxmind.geoip2.record.Subdivision;
import com.maxmind.geoip2.record.City;
import com.maxmind.geoip2.record.Location;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.Objects;
import cn.hutool.core.lang.Console;
/*** @author weimeilayer@gmail.com ✨* @date 💓💕2024年7月4日 🐬🐇 💓💕*/
public class GeoIPChecker {private static final String ALLOWED_COUNTRY = "China";private static final String ALLOWED_PROVINCE = "Chongqing";public static void main(String[] args) throws Exception {long startTime = System.currentTimeMillis();Console.log("--------------------------开始时间 " + startTime);// 创建 GeoLite2 数据库File file = new File("D:\\GeoLite2-City.mmdb");// 读取数据库内容DatabaseReader reader = new DatabaseReader.Builder(file).build();// 获取客户端 IPHttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();String ip = JakartaServletUtil.getClientIP(request);// 查询地理位置信息String siteAddress = getGeoLocation(reader, ip);Console.log(siteAddress);// 判断是否在允许范围内if (isAllowed(ip, reader)) {Console.log("允许访问");} else {Console.log("不允许访问");}long endTime = System.currentTimeMillis();Console.log("--------------------------结束时间 " + endTime + " 耗时 " + (endTime - startTime) + " 毫秒");}public static String getGeoLocation(DatabaseReader reader, String ip) throws IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName(ip);CityResponse response = reader.city(ipAddress);Country country = response.getCountry();Subdivision subdivision = response.getMostSpecificSubdivision();City city = response.getCity();Location location = response.getLocation();return "国家:" + country.getName() +"\n省份:" + subdivision.getName() +"\n城市:" + city.getName() +"\n经度:" + location.getLongitude() +"\n纬度:" + location.getLatitude();}public static boolean isAllowed(String ip, DatabaseReader reader) throws IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName(ip);CityResponse response = reader.city(ipAddress);// 检查国家和省份是否在允许的范围内String country = response.getCountry().getName();String province = response.getMostSpecificSubdivision().getName();// 使用全局变量进行检查if (ALLOWED_COUNTRY.equals(country) && ALLOWED_PROVINCE.equals(province)) {return true;}return false;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java代理简单理解
  • 评估测试用例有效性 5个方面
  • 数学建模中常用的数据处理方法
  • c++:内存管理
  • Linux下使用arping检测IP地址是否冲突
  • 智慧园区管理系统建设方案(Word完整原件)
  • 双栈实现一个队列
  • 新手小白的pytorch学习第一弹-------张量
  • 生成日志系统和监控
  • 算法·高精度
  • C++的介绍与认识
  • 用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法
  • 对称加密和非对称加密解析
  • 关于力扣150题目——逆波兰表达式求值Java实现的三种解法
  • 如何写好品牌宣传稿提升品牌曝光?看这篇文章就够了
  • [PHP内核探索]PHP中的哈希表
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017 年终总结 —— 在路上
  • CSS中外联样式表代表的含义
  • docker容器内的网络抓包
  • Effective Java 笔记(一)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Iterator 和 for...of 循环
  • JavaScript 一些 DOM 的知识点
  • MySQL QA
  • Spring Cloud中负载均衡器概览
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从零开始在ubuntu上搭建node开发环境
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 七牛云假注销小指南
  • 深入 Nginx 之配置篇
  • 时间复杂度与空间复杂度分析
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 学习Vue.js的五个小例子
  • 最简单的无缝轮播
  • elasticsearch-head插件安装
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • # 职场生活之道:善于团结
  • #android不同版本废弃api,新api。
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (007)XHTML文档之标题——h1~h6
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)DockerCompose安装与配置
  • (转)IOS中获取各种文件的目录路径的方法
  • .apk文件,IIS不支持下载解决