Java居然还能实现这种骚操作?通过它来获取ip属地。

全网显示 IP 归属地,用上这个开源库,实现也太简单了 细心的小伙伴可能会发现,最近蘑菇新上线了 IP 属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的 IP 属地信息动态显示IP属地在蘑菇群聊中,也 可 以 展 示 IP 属 地,下面是小伙伴们在交流群中显示的下面,我就来讲讲,Java 中是如何获取 IP 属地的,主要分为以下几步通过 HttpServletRequest 对象,获 取 用户的 IP 地址通过 IP 地址,获取对应的省份、城市。 阅读详情

前言

     我相信很多的小伙伴应该都发现了这个功能吧,就是刷抖音,不管是评论也好,还是发布作品也好,下面都会显示自己的所在地。这个功能是不是觉得非常的神奇呢?那么咱们可以用代码来实现这个过程?答案是肯定的!

 每句评论下方是不是都有湖南这个ip归属地!今天教大家如何用Java来实现这一功能吧

正文

     下面就来正式的为大家详细介绍是如何来通过JAVA来获取ip地址的吧1

其实主要分为两个部分,

1.通过HttpServletRequest对象来获取用户的ip地址

2.通过ip地址来获取对方的省份和城市

首先咱们需要先写一个ip获取的工具类,因为每次用户的request请求都是会戴上请求的ip地址放在请求头里面的

public class IpUtil {
    public static String getIpAddr(ServerHttpRequest request) {
        HttpHeaders headers = request.getHeaders();
        String ipAddress = headers.getFirst("X-Forwarded-For");
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = headers.getFirst("Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = headers.getFirst("WL-Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddress().getAddress().getHostAddress();
            if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
                // 根据网卡取本机配置的IP
                try {
                    InetAddress inet = InetAddress.getLocalHost();
                    ipAddress = inet.getHostAddress();
                } catch (UnknownHostException e) {
                    log.error("根据网卡获取本机配置的IP异常", e);
                }
 
            }
        }
 
        // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if (ipAddress != null && ipAddress.indexOf(",") > 0) {
            ipAddress = ipAddress.split(",")[0];
        }
 
        return ipAddress;
    }
}

这里有三个名词,分别是

X-Forwarded-For:一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址。每个 IP 地址,每个值通过逗号+空格分开,最左边是最原始客户端的 IP 地址,中间如果有多层代理,每⼀层代理会将连接它的客户端 IP 追加在 X-Forwarded-For 右边。

X-Real-IP:一般只记录真实发出请求的客户端IP

Proxy-Client-IP:这个一般是经过 Apache http 服务器的请求才会有,用 Apache http 做代理时一般会加上 Proxy-Client-IP 请求头

WL-Proxy-Client-IP:也是通过 Apache http 服务器,在 weblogic 插件加上的头。
 

在我们获取到用户的 IP 地址后,那么就可以获取对应的 ip 信息了
我在 Github 冲浪的时候,发现了 Ip2region 项目。

一个准确率 99.9% 的离线 IP 地址定位库,0.0x 毫秒级查询,ip2region.db 数据库只有数 MB,提供了 java,php,c,python,nodejs,golang,c# 等查询绑定和Binary,B树,内存三种查询算法。

数据聚合了一些知名 ip 到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真 IP 定位准确一些。ip2region 的数据聚合自以下服务商的开放 API 或者数据。

80%, 淘宝IP地址库, http://ip.taobao.com/

≈10%, GeoIP, https://geoip.com/

≈2%, 纯真IP库, http://www.cz88.net/

 备注:如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。

每条 ip 数据段都固定了格式:

_城市Id|国家|区域|省份|城市|ISP_
只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是 0,已经包含了全部你能查到的大大小小的国家

生成的数据库文件 ip2region.db 只有几 MB,最小的版本只有 1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过 8MB。
 

 

内置的三种查询算法
全部的查询客户端单次查询都在 0.x 毫秒级别,内置了三种查询算法

memory 算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。

binary 算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。

b-tree 算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。

ip2region安装
下面,就让我们给项目引入 ip2region,进行 ip 信息转换吧

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

 然后编写一个工具类 IpUtils ,首先需要加载 ip2region.db 文件

static {
    dbPath = createFtlFileByFtlArray() + "ip2region.db";
    try {
        config = new DbConfig();
    } catch (DbMakerConfigException e) {
        e.printStackTrace();
    }
    try {
        searcher = new DbSearcher(config, dbPath);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

在加载的时候,需要下载仓库中的 ip2region.db 文件,然后放到 resource 目录下

然后,通过内置的三种算法,分别转换用户 ip 地址

 

    public static String getCityInfo(String ip) {
 
        if (StringUtils.isEmpty(dbPath)) {
            log.error("Error: Invalid ip2region.db file");
            return null;
        }
        if(config == null || searcher == null){
            log.error("Error: DbSearcher or DbConfig is null");
            return null;
        }
 
        //查询算法
        //B-tree, B树搜索(更快)
        int algorithm = DbSearcher.BTREE_ALGORITHM;
 
        //Binary,使用二分搜索
        //DbSearcher.BINARY_ALGORITHM
 
        //Memory,加载内存(最快)
        //DbSearcher.MEMORY_ALGORITYM
        try {
            // 使用静态代码块,减少文件读取操作
//            DbConfig config = new DbConfig();
//            DbSearcher searcher = new DbSearcher(config, dbPath);
 
            //define the method
            Method method = null;
            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:
            }
 
            DataBlock dataBlock = null;
            if (Util.isIpAddress(ip) == false) {
                System.out.println("Error: Invalid ip address");
            }
 
            dataBlock = (DataBlock) method.invoke(searcher, ip);
            String ipInfo = dataBlock.getRegion();
            if (!StringUtils.isEmpty(ipInfo)) {
                ipInfo = ipInfo.replace("|0", "");
                ipInfo = ipInfo.replace("0|", "");
            }
            return ipInfo;
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return null;
    }

下面,我们编写 main 函数进行测试,发现可以正常的解析出 ip 信息

由于 ip 属地在国内的话,只会展示省份,而国外的话,只会展示国家。所以我们还需要对这个方法进行一下封装,得到获取 IP 属地的信息。

/**
 * 获取IP属地
 * @param ip
 * @return
 */
public static String getIpPossession(String ip) {
    String cityInfo = getCityInfo(ip);
    if (!StringUtils.isEmpty(cityInfo)) {
        cityInfo = cityInfo.replace("|", " ");
        String[] cityList = cityInfo.split(" ");
        if (cityList.length > 0) {
            // 国内的显示到具体的省
            if ("中国".equals(cityList[0])) {
                if (cityList.length > 1) {
                    return cityList[1];
                }
            }
            // 国外显示到国家
            return cityList[0];
        }
    }
    return "未知";
}
/**
 * 获取IP属地
 * @param ip
 * @return
 */
public static String getIpPossession(String ip) {
    String cityInfo = getCityInfo(ip);
    if (!StringUtils.isEmpty(cityInfo)) {
        cityInfo = cityInfo.replace("|", " ");
        String[] cityList = cityInfo.split(" ");
        if (cityList.length > 0) {
            // 国内的显示到具体的省
            if ("中国".equals(cityList[0])) {
                if (cityList.length > 1) {
                    return cityList[1];
                }
            }
            // 国外显示到国家
            return cityList[0];
        }
    }
    return "未知";
}
/**
 * 获取IP属地
 * @param ip
 * @return
 */
public static String getIpPossession(String ip) {
    String cityInfo = getCityInfo(ip);
    if (!StringUtils.isEmpty(cityInfo)) {
        cityInfo = cityInfo.replace("|", " ");
        String[] cityList = cityInfo.split(" ");
        if (cityList.length > 0) {
            // 国内的显示到具体的省
            if ("中国".equals(cityList[0])) {
                if (cityList.length > 1) {
                    return cityList[1];
                }
            }
            // 国外显示到国家
            return cityList[0];
        }
    }
    return "未知";
}

下面,我们在找一个 国外的 IP 测试一下效果。可以看到已经能够正常的显示 IP 属地信息了~

到这里如果获取用户的 IP 属地已经完成啦,如果想要了解关于更多 ip2region 的功能!如果你想要本项目的全部源代码可关注我哦~

 

Java根据ip地址获取归属地 最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等。 对这里出现的几个名词解释一下:X-Forwarded-For:一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址。每个 IP 地址,每个值通过逗号+空格分开,最左边是最原始客户端的 IP 地址,中间如果有多层代理,每⼀层代理会将连接它的客户端 IP 追加在 X-Forwarded-For 右边。Proxy-Client-IP:这个一般是经过 Apache http 服务器的请求才会有 阅读详情

相关推荐

Java 获取IP地址,获取归属地

ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

一碗清深的博客 1654

记录SpringCloud Gateway获取请求体的方法

在SpringCloud Gateway里获取请求体的方法,这个方法可以兼容版本,而且不会有requestbody不全问题 @Component @Slf4j public class ReqTraceFilter implements GlobalFilter, GatewayFilter, Ordered { @Resource private IPlatformFeignClient platformFeignClient; /** * httphea..

qq_41910048的博客 2545

Excel地理探测器实战:5分钟搞定空间分异性分析(附完整数据集)

本文详细介绍了如何使用Excel地理探测器插件进行空间分异性分析。通过5分钟实战教程,手把手指导数据格式准备、软件操作及四大探测器(分异及因子、交互作用、风险区、生态探测器)的结果解读,帮助规划师、研究者快速验证地理因素对现象分布的影响,大幅降低GIS分析门槛。

peace的博客 607

关于springcloud Gateway中的限流

我们在开发系统的时候可能会对系统进行限流的需求, springcloudGateway有自带限流的方案,在此之前可以先去学习一下springcloud gateway中的filter。springcloud Gateway中提供了一个RequestRateLimiterGatewayFilterFactory。这种限流方式用到了redis...

weixin_33843947的博客 418

腾讯会议+OBS虚拟摄像头:解决多人屏幕共享的终极指南(附常见问题排查)

本文详细介绍了如何利用OBS虚拟摄像头技术,解决腾讯会议中多人屏幕共享的痛点。通过将OBS作为视频混流中心,可以突破腾讯会议单屏共享的限制,实现多屏幕、多窗口内容的同步展示,并提升演示的专业度。文章涵盖了Windows与Linux双平台的配置步骤、高阶场景搭建以及常见问题(如黑屏、画中画)的排查方法,是团队协作与专业演示的实用指南。

i8j9k0l1的博客 930

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

用getAddress方法获得IP地址

Java编程基础:用getAddress方法获得IP地址  发布时间:2009.04.22 04:51     来源:blogjava    作者:blogjavagetAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形

王军辉的专栏 2715

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2621

spring cloud gateway微服务网关的简单使用

一、spring cloud gateway微服务网关简介 为什么需要网关? 在微服务架构中,每个服务是一个独立运行的组件,每个服务都会完成特定的功能,例如订单服务、评论服务、库存服务。假设客户端发起一个请求,我们所有的服务端都需要一个认证的程序,认证客户端来的请求是否是认证过得,例如登录。这样我们的各个微服务就会做重复的工作,所以我们为了解决类似的重复工作问题,我们就引入一个微服务网关。 网关可以做些什么呢?网关可以做:授权、日志、限流、路由等工作。网关服务有:openRes......

unknowna的专栏 1350

QT 实现QStackedWidget切换页面右移动画

首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断的改变geometry;当动画结束的时候,隐藏并释放这个QLabel。以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。为了方便查看动画特效,设置了每个界面的背景图片。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 881

Python爬虫案例——解密抓取西红柿小说《我不是戏神》全章节!!!

本文介绍了抓取番茄小说网站《我不是戏神》全本内容的完整流程。首先分析网站反爬机制,发现采用自定义混淆字体加密文本内容。通过下载字体文件并解析字符映射关系,组建本地字体映射表。随后编写Python爬虫程序,实现自动获取章节链接、请求加密内容、解密替换字体、保存为本地txt文件等功能。代码包含UA伪装、请求头设置、进度条显示等细节处理,最终实现小说内容的完整抓取与解密存储。

@优快云盲敲代码的阿豪的博客 659

Java 中是如何获取 IP 属地的

细心的小伙伴可能会发现,抖音新上线了 IP 属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的 IP 属地信息 这里有三个名词,分别是X-Forwarded-For:一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址。每个 IP 地址,每个值通过逗号+空格分开,最左边是最原始客户端的 IP 地址,中间如果有多层代理,每⼀层代理会将连接它的客户端 IP 追加在 X-Forwarded-For 右边。X-Real-IP:一般只记录真实发出请求的客户端IP

退役复学在校大学生,目光所至,皆为华夏 17万+

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 551

Java获取IP地址及对应的归属地

Java获取IP地址及对应的归属地

Javaの甘乃迪的博客 1万+

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1686

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IP属地信息哪里来的?手把手教你实现通过IP查询属地信息

本文主要讲解IP查询属地信息的实现方法,以及基于Spring Boot实现IP属地信息查询项目。 〇、前言 近日,多个网络公众平台纷纷公开显示用户的IP属地,并且用户无法开启或关闭此功能。 用户的IP信息,平台是怎么知道的? 其大致流程是这样的: 用户的手机、电脑等设备必须通过网络运营商(电信、移动等)进行联网服务,这个连接网络的过程中,基站、路由器将为该设备动态分配一个IP; 用户发布一篇文章或微博,或者进行评论时,就会向平台服务器发送一个HTTP请求。而IP信息,就包含在这个HTTP请求头里; 平.

拾年之璐 5788

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java实现获取IP及归属地

java代码获取用户ip归属地

weixin_53904739的博客 3077

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)

通过IP获取IP归属地,Java如何实现通过IP获取IP归属地【离线+在线】(附代码),在线离线模式获取归属地,获取IP归属,获取访问IP

赏樱看雪撸代码 4701

手把手教你用Java获取IP归属地

前几个月微信公众号上线了IP归属地的功能,后续知乎、抖音等平台纷纷添加了该功能。如果是国内的用户精确到省份,国外用户精确到国家。本文就使用Java实现获取IP归属地。

qq_42700121的博客 3952

IP属地的功能是如何实现的呢,简单实现获取ip地址和IP属地。

获取ip地址,ip属地

qq_52227892的博客 2361

使用 ip2region 获取用户的 IP 归属地

ip2region 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。

m0_53062159的博客 7331

Java获取IP及归属地

网络编程

m0_63823719的博客 4391

Java根据IP地址获取对应归属地

数据聚合了一些知名 ip 到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真 IP 定位准确一些。01,>80%,淘宝IP地址库,http://ip.taobao.com/%5C03,≈2%,纯真 IP 库,http://www.cz88.net/%5C备注:如果上述开放 API 或者数据都不给开放数据时 ip2region 将停止数据的更新服务。根据IP地址获取对应归属地的介绍就到这了,有问题的小伙伴们可以在评论区讨论。

吴名氏的博客 13万+

JAVA-IP和手机号归属地查询

1.获取IP归属地接口: http://ip.taobao.com/service/getIpInfo.php?ip= 2.获取手机号归属地接口: http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel= 下面是简单代码实现 import java.io.BufferedReader; import j...

fangzg811107320的博客 7万+

Go实现全球IP属地,这个离线库真不错

当然,作为最赚钱的软件,它也是在各个领域有所涉足的,比如火到不行的人工智能大模型,虽然其底层是谷歌开源的大模型,也会用到python,大数据方面会用到java,如今rust也跻身编程语言名流。根据IP获取归属地的功能在最近几年开始流行起来,特别是一些具有社交属性的app ,比如非常火爆的抖音,西瓜视频,今日头条,微信,微博。目前实现IP属地的方式有两种,一是通过外网ip 去调用第三方地图服务的api 来做,比如高德地图,腾讯地图,百度地图。如果你是在外网写代码,可以使用获取ip 的库来快速得到ip。

weixin_44058951的博客 1728

使用Java获取IP归属地的方法与实现

使用Java获取IP归属地

丨恰同学少年的博客 1801
上一篇: 听说你文件夹非常难找?用Python打造一款文件搜索工具,所有功能自己定义!
PythonJavaPHP
博客等级 码龄7年 116粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值