Java根据ip地址获取归属地

java通过ip地址获取相应对应的城市 发现了一比较好的本地ip对应地址的库资源文件--做一下笔记。 官方网站 https://dev.maxmind.com/geoip/geoip2/geolite2/ 这里提供了免费的库文件,还有很好的api支持。 (国内也用一个叫www.ipip.net 也有类似的) 第一、java 获取IP地址 public static String getRemortIP(HttpServ...... 阅读详情

最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等。

下面,我就来讲讲,Java 中是如何获取 IP 属地的,主要分为以下几步

  • 通过 HttpServletRequest 对象,获取用户的 IP 地址
  • 通过 IP 地址,获取对应的省份、城市

首先需要写一个 IP 获取的工具类,因为每一次用户的 Request 请求,都会携带上请求的 IP 地址放到请求头中。

public class IpUtils {

    /**
     * 获取ip地址
     * @param request
     * @return
     */
    public static String getIpAddr(HttpServletRequest request){
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("X-Forwarded-For");
            if (ipAddress != null && ipAddress.length() != 0 && !"unknown".equalsIgnoreCase(ipAddress)) {
                // 多次反向代理后会有多个ip值,第一个ip才是真实ip
                if (ipAddress.indexOf(",") != -1) {
                    ipAddress = ipAddress.split(",")[0];
                }
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("HTTP_CLIENT_IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
            }
        }catch (Exception e) {
            log.error("IPUtils ERROR ",e);
        }
        return ipAddress;
    }

对这里出现的几个名词解释一下:

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

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

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

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

  • HTTP_CLIENT_IP:代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。

这里,要着重介绍一下Ip2region项目。

github地址:github.com/lionsoul201…

 

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

内置的三种查询算法

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

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

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

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

使用方法

1、引入ip2region依赖

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

2、下载仓库中的ip2region.db 文件,放到工程resources目录下

3、编写方法加载ip2region文件,对用户ip地址进行转换。

/**
 * 获取ip属地
 * @param ip
 * @return
 * @throws Exception
 */
public static String getCityInfo(String ip) throws Exception {
    //获得文件流时,因为读取的文件是在打好jar文件里面,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource[] resources = resolver.getResources("ip2region.db");
    Resource resource = resources[0];
    InputStream is = resource.getInputStream();
    File target = new File("ip2region.db");
    FileUtils.copyInputStreamToFile(is, target);
    is.close();
    if (StringUtils.isEmpty(String.valueOf(target))) {
        log.error("Error: Invalid ip2region.db file");
        return null;
    }
    DbConfig config = new DbConfig();
    DbSearcher searcher = new DbSearcher(config, String.valueOf(target));
    //查询算法
    //B-tree, B树搜索(更快)
    int algorithm = DbSearcher.BTREE_ALGORITHM;
    try {
        //define the method
        Method method;
        method = searcher.getClass().getMethod("btreeSearch", String.class);
        DataBlock dataBlock;
        if (!Util.isIpAddress(ip)) {
            log.error("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;
}

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

public static String getIpPossession(String ip) throws Exception {
    String cityInfo = IpUtils.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 "未知";
}

5、编写测试类。

public static void main(String[] args) throws Exception {

    //国内ip
    String ip1 = "220.248.12.158";

    String cityInfo1 = IpUtils.getCityInfo(ip1);
    System.out.println(cityInfo1);
    String address1 = IpUtils.getIpPossession(ip1);
    System.out.println(address1);

    //国外ip
    String ip2 = "67.220.90.13";
    String cityInfo2 = IpUtils.getCityInfo(ip2);
    System.out.println(cityInfo2);
    String address2 = IpUtils.getIpPossession(ip2);
    System.out.println(address2);
}

6、测试结果

最后,附上项目用到的全部依赖,想了解的小伙伴可以学习一下!

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>
<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.7.2</version>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
Java 获取IP地址,获取归属地 ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。 阅读详情

相关推荐

Vivado工程芯片型号更换全流程:从IP更新到生成新bit文件(避坑指南)

本文详细介绍了Vivado工程中更换芯片型号的全流程,包括IP更新、约束文件适配和生成新bit文件的关键步骤。特别针对FPGA开发中常见的兼容性问题提供避坑指南,帮助开发者高效完成芯片迁移,确保设计稳定性和性能优化。

weixin_42549451的博客 300

java根据用户请求获取ip地址,并解析省市信息

Ip2region,java,,ip定位

weixin_43993310的博客 1万+

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位

本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。

rice5的博客 952

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

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

吴名氏的博客 13万+

从Canny到深度学习:边缘检测指标进化史(含ODS/OIS/AP的数学推导)

本文系统梳理了边缘检测评估指标的演进历程,从经典的Canny算子到深度学习时代,重点解析了ODS、OIS和AP三大核心指标的设计哲学与数学推导。文章深入探讨了基于PR曲线的评估体系,揭示了不同指标(如ODS与OIS)在阈值优化上的差异,并分析了AP指标在边缘检测任务中的优势与局限,为算法研究和模型评估提供了实用指南。

b9c0d的博客 200

TBtools的序列提取步骤

本教程详细介绍了如何使用TBtools软件从原来的FASTA序列中提取特定的DNA序列。

weixin_47509995的博客 1万+

Java根据IP地址获取归属地

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

秃了也弱了 1412

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4169

JAVA根据ip地址获取归属地

​ 如果使用API接口获取,可能会出现服务挂了,或者服务地址不提供服务了等问题。而采用本地地址库就没有这些问题。 本文采用离线IP地址定位库Ip2region,Ip2region是一个离线IP地址定位库,微秒的查询时间获取归属地

weixin_49128211的博客 2790

30. 用GPT-4自动生成测试用例的完整流程

利用GPT - 4生成测试用例面临的主要问题包括:如何准确地将软件需求转化为GPT - 4能够理解的输入提示,以确保生成的测试用例覆盖所有关键功能;如何评估生成的测试用例的有效性和充分性;如何处理生成的测试用例中的错误或不合理之处;以及如何将生成的测试用例集成到现有的测试框架中。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 473

全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。

本篇博客介绍的知识是——深度学习之PyThon框架基础。这是深度学习/神经网络的基础,多次回顾,会有不一样的感受。书读百遍,其义自见。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 5793

Java根据请求的IP地址获取该请求的详细地址

Java根据请求的IP地址获取该请求的详细地址 在阿里云官网购买“全球IP归属地查询 - IP定位 - IP查询 - 支持高并发-毫秒级-免费”的服务。 购买完成后就可以在Java中开始编写代码调用服务了。首先创建地址类。 package com.example.demo.model; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; /** * * @Title: DetailedAddressPar

weixin_44380294的博客 575

PSINS工具箱学习(四)捷联惯导更新算法

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning。

实践出真理,接毕设/课设项目开发指导 607

网关中集成ip2region的方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33777877的博客 318

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

Javaの甘乃迪的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

如何获取处理好的IP地址归属地信息呢?

自从各大平台显示IP地址后,相信大家对于IP地址已经不陌生了,那么各大平台是如何实现获取IP地址呢?其实想要实心IP地址的归属地单纯靠调用接口获取IP归属地相关信息在发挥效率上面很难发挥到极致,所以小编今天来给大家分享一个十分好用的IP地址离线库,支持API查询和离线库交付呦~除此之外,IP数据云还提供“接口定制”服务,可以根据客户的业务领域及应用场景,进行个性化定制,满足客户多场景的业务需求。首先,想要直到IP地址的信息,IP地址是必要的。如何获取处理好的IP地址归属地信息呢?·离线获取IP地址属地库。

IpdataCloud的博客 479

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java根据ip地址获取详细地域信息

互联网有很多接口可以实现通过ip查询到具体的位置,如下: 通过淘宝IP地址库获取IP位置 1. 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 2. 响应信息:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商 3. 返回数据格式: {"code":0,"data":{"ip":"

hezhoujun的专栏 3万+

Java获取IP及归属地

Java获取IP及归属地

_江屿_ 598

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

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

qq_30942697的博客 1983

java根据IP获取用户所在地

import java.io.BufferedReader;  import java.io.DataOutputStream;  import java.io.InputStreamReader;  import java.net.HttpURLConnection;  import java.net.URL;    import org.json.JSONObject;    public c...

Onlyiyou的博客 1691

Java - java代码实现ip归属地查询,调用百度ip地址查询,局域网也能查询到位置

java代码实现ip归属地查询,调用百度ip地址查询,局域网也能查询到位置

weixin_43652507的博客 1622
上一篇: 深入分析JVM执行引擎
下一篇: 京东资深架构师,耗时多年精心整理Java核心知识点,助你成神
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值