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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【spring MVC的执行流程】

SpringMVC可以说是Servlet的封装&#xff0c;屏蔽了Servlet的很多细节&#xff0c;比如Servlet再获取参数的时候需要不停地getParameter,现在只要在SpringMVC方法定义对应的JavaBean&#xff0c;只要属性和参数名一致&#xff0c;SpringMVC就可以帮我们实现将参数封装到JavaBea…

【Linux】目录和文件的权限意义

现在我们知道了Linux系统内文件的三种身份&#xff08;拥有者、用户组与其他人&#xff09;&#xff0c;知道每种身份都有三种权限&#xff08;rwx&#xff09;&#xff0c;也知道能够使用chown、chgrp、chmod修改这些权限与属性&#xff0c;当然&#xff0c;利用IS-l去查看文件…

wordpress企业网站模板免费下载

大气上档次的wordpress企业模板&#xff0c;可以直接免费下载&#xff0c;连注册都不需要&#xff0c;网盘就可以直接下载&#xff0c;是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…

ActiveAnno3D采用主动学习实现领域自适应,实现大规模数据集的快速标注(代码开源)

Abstract 大规模数据集的策划仍然成本高昂且需要大量时间和资源。数据通常需要手动标注&#xff0c;创建高质量数据集的挑战依然存在。在这项工作中&#xff0c;我们使用主动学习填补了多模态3D目标检测研究的空白。我们提出了ActiveAnno3D&#xff0c;这是一种主动学习框架&a…

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus&#xff08;Element UI的Vue 3版本&#xff09;、ECharts等前端资源&#xff0c;使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址&#xff1a;简单直接&#xff0c…

【踩坑】修复报错Cannot find DGL libdgl_sparse_pytorch_2.2.0.so

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 错误复现 原因分析 解决方法 错误复现 import dgldataset dgl.data.CoraGraphDataset() graph dataset[0] graph.adjacency_matrix() 原因分…

centos通过官网下载安装最新版mysql方案

官网下载步骤&#xff1a; 点击DOCUMENTATION mysql的yum仓库Using the MySQL Yum Repository 向下翻&#xff0c;查看安装命令 点击下载mysql安装包 下载对应的版本 不注册&#xff0c;直接下载社区版 下载好的安装包 安装步骤&#xff1a; 把rpm包导入到服务器…

ConsiStory:无需训练的一致性文本到图像生成技术

随着大规模文本到图像&#xff08;T2I&#xff09;扩散模型的发展&#xff0c;用户可以更自由地通过文本指导图像生成过程。然而&#xff0c;要在不同的提示中保持同一主题的视觉一致性仍然是一个挑战。现有的方法通常需要对模型进行微调或预训练&#xff0c;以教授新词汇来描述…

2.2.1 ROS2案例以及案例分析

1.案例需求 需求1&#xff1a;编写话题通信实现&#xff0c;发布方以某个频率发布一段文本&#xff0c;订阅方订阅消息&#xff0c;并输出在终端。 需求2&#xff1a;编写话题通信实现&#xff0c;发布方以某个频率发布自定义接口消息&#xff0c;订阅方订阅消息&#xff0c;并…

在docker配置Nginx环境配置

应用于商业模式集中&#xff0c;对于各种API的调用&#xff0c;对于我们想要的功能进行暴露&#xff0c;对于不用的进行拦截进行鉴权。用于后面的付费 开发环境 正式上线模式 一、常用命令 停止&#xff1a;docker stop Nginx重启&#xff1a;docker restart Nginx删除服务&a…

Liunx网络配置

文章目录 一、查看网络配置永久修改网卡临时修改网卡 二、查看主机名称 hostname三、查看路由表条目 route四、查看网络连接情况netstat五、获取socket统计信息ss六、查看当前系统中打开的文件和进程的工具lsof七、测试网络连通性ping八、跟踪数据包 traceroute九、域名解析 ns…

【vmbox centos7 网络配置】【centos7 glances 安装】【centos7 安装MySQL5.7】

文章目录 vmbox centos7 网络配置centos7 修改镜像地址centos7 安装 glancesCentOS 7 上安装 MySQL 5.7 并进行基本的安全配置使用 firewalld 开放 3306 端口 可以远程连接mysql vmbox centos7 网络配置 目前 能组建集群 虚拟机网络互通&#xff0c;虚拟机能访问外网 创建一个…

FlinkCDC-3.1.1 DataStream Source

问题&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.catalog.ObjectPath 解决&#xff1a; 在poml文件中&#xff0c;导入的flink-table依赖把“ <scope>”去掉 <properties><maven.compiler.source>8</maven.compi…

链串算法库构建

学习贺利坚老师链串算法库 数据结构之自建算法库——链串_串数据结构-CSDN博客 本人详细解析博客 串的链式存储及其基本操作实现_串链式存储的操作-CSDN博客 版本更新日志 V1.0 : 结合顺序串操作, 使用链串进行优化, 此次链串, 空间将不受限制, 只写了最基本的操作, 相当于 单链…

地级市空气质量指数AQI、环境污染PM2.5、SO2

2015-2021年地级市月度空气质量数据&#xff08;AQI、SO2、NO2、PM2.5、PM10、O3、CO&#xff09; 目录 探究环境污染对经济增长的影响 一、引言 二、数据来源与描述性统计 三、实证模型 &#xff08;一&#xff09;模型设定 &#xff08;二&#xff09;变量说明 四、程…

经典递归分析

在前面一篇中, 已经看过许多直观的递归的例子, 在这篇里, 将分析两个经典的递归问题, 阶乘与菲波那契数列数列, 在此过程中, 还将对比递归与循环(迭代)间的异同, 探讨递归与内存中的栈的关系, 以及递归的效率等问题. 如无特别说明, 示例使用的是 Java, IDE 则为 Eclipse. 阶乘(…

介绍一些好玩且实用的开源的AI工具

介绍一些好玩且实用的开源的AI工具 随着人工智能技术的迅猛发展&#xff0c;开源社区涌现出了许多关于AI的项目&#xff0c;这些项目不仅展示了技术的创新力&#xff0c;也为开发者提供了丰富的工具和资源。本文将介绍几个既有趣又实用的开源人工智能工具&#xff0c;它们不仅…

【电路笔记】-B类放大器

B类放大器 文章目录 B类放大器1、概述2、B类放大器介绍3、推挽式配置4、限制交叉失真5、B类放大器效率6、总结1、概述 我们在之前的文章中已经知道,A 类放大器的特点是导通角为 360,理论最大效率为 50%。 在本文中,我们将详细介绍另一类放大器,称为B类放大器,它是为解决A…

GD32单片机使用TIMER进行外部计数

网上关于使用GD32单片机的ETI引脚作为计数器输入引脚的资料少之又少&#xff0c;此文希望有需要的朋友避免弯路。 我们把ETI引脚作为方波输入引脚&#xff0c;其中ETR输入引脚为PA0。通过查资料得知&#xff1a; 因此将先将引脚进行映射&#xff0c;代码如下&#xff1a; voi…

Linux_进程池

目录 1、进程池基本逻辑 2、实现进程池框架 3、文件描述符的继承 4、分配任务给进程池 5、让进程池执行任务 6、回收子进程 7、进程池总结 结语 前言&#xff1a; 在Linux下&#xff0c;进程池表示把多个子进程用数据结构的方式进行统一管理&#xff0c;在任何时候…