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

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

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

主要讲解几个步骤:

  • Java获取请求IP
  • 解决Nginx转发问题
  • 通过IP地址获取归属地

获取IP地址

首先使用基于Spring Boot搭建项目,在controller添加HttpServletRequest请求参数:

@RestController
public class IpController {
    @GetMapping("/ip-address")
    public String ipAddress(HttpServletRequest request)  {
        // 接收request  
    }
}
复制代码

通过HttpServletRequest获取IP地址:

String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
}
return ip;
复制代码

在本地环境调用获取IP,要么是0:0:0:0:0:0:0:1,或者是局域网IP。

局域网IP是以192.168.x.x开头,或者是127.0.0.1的IP。

所以需要部署到外网服务器才能获取到公网地址。部署到外网服务器能成功获取IP地址。

Nginx 反向代理问题

直接访问公网服务器地址能成功获取IP地址,但是通过Nginx反向代理获取的都是127.0.0.1。客户端请求Nginx服务器再反向代理转发到服务端,此时拿到的IP反向代理的IP,也就是Nginx服务器的IP,并不是真正的客户端IP。

在Nginx的配置文件中的location模块添加以下配置,将客户端的IP传入到Nginx服务:

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
复制代码

示例:

server {  
    listen 80;  
    server_name localhost;  
    location / { 
         proxy_set_header        X-Real-IP       $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://xxxx;
    }
复制代码

完成以上操作之后,就能成功获取到IP了。然后通过IP获取归属地了。

IP获取归属地

通过IP获取归属地一般都从地址库找到匹配的地址,本文介绍两种方法.

通过归属地API获取

需要发起http请求,这里使用Spring Boot的RestTemplate发起http请求,首先创建RestTemplate的bean实例:

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
复制代码

再调用RestTemplate发起http请求:

private String URL = "https://api.beijinxuetang.com/api/common/ip";
JSONObject jsonObject = new JSONObject();
jsonObject.put("ip",ip);
JSONObject json = restTemplate.postForObject(URL,jsonObject, JSONObject.class);
if (json.getInteger("code") == 0) {
    json = json.getJSONObject("data");
    // 国家
    String nation = json.getString("nation");
    // 省份
    String province = json.getString("province");
    // 市
    String city = json.getString("city");
}
复制代码

上面的json是引入fastjson。

通过地址库获取

使用API接口,可能会出现服务挂了,或者服务地址不提供服务了等问题。而采用本地地址库就没有这些问题。

本文采用离线IP地址定位库 Ip2region,Ip2region是一个离线IP地址定位库,微秒的查询时间:

首先找到在gihub官网找到地址库ip2region.xdb,具体路径为data/ip2region.xdb:

将ip2region.xdb放在项目的resources目录下:

引入maven依赖:

<dependency>
			<groupId>org.lionsoul</groupId>
			<artifactId>ip2region</artifactId>
			<version>2.6.5</version>
		</dependency>
复制代码

获取归属地:

private Searcher searcher;

@Override
    public String getIpAddress(String ip){
        if ("127.0.0.1".equals(ip) || ip.startsWith("192.168")) {
            return "局域网 ip";
        }
        if (searcher == null) {
            try {
                File file = ResourceUtils.getFile("classpath:ipdb/ip2region.xdb");
                String dbPath = file.getPath();
                searcher = Searcher.newWithFileOnly(dbPath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String region = null;
        String errorMessage = null;
        try {
            region = searcher.search(ip);
        } catch (Exception e) {
            errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.length() > 256) {
                errorMessage = errorMessage.substring(0,256);
            }
            e.printStackTrace();
        }
        // 输出 region
    }

复制代码

获取region就能获取到IP归属地了。例如中国|0|广东省|广州市|电信。

小程序效果展示

根据上面的程序,做了一个小程序展示归属地。

页面效果图:

扫一扫,就能获取查到自己的归属地了。

通过ip获取所在地理位置、通过手机号获取归属地 目录准备工作1、准备pom.xml2、准备http工具类,类名是HttpUtils(自己找位置放置,只要能用到就可以了)一、通过ip获取所在地址位置方法一、使用http://whois.pconline.com.cn方法二、使用https://ip.cn/api/index二、通过手机号获取归属地 准备工作 1、准备pom.xml 本次项目使用springboot,使用依赖如下: <dependencies> <!-- 启动依赖 --> <dependency& 阅读详情

相关推荐

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

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

一碗清深的博客 1654

Java实现根据ip地址获取所在地,判断是否中国或国外或者地区

Java实现根据ip地址获取所在地,判断是否中国或国外或者地区。 实现思路 1.根据ip地址获取所在地,最好有国家标识 2.根据所在地,判断是在中国,还是国外 具体实现 1.根据ip地址获取所在地,最好有国家标识 public static String getAddressByIp(String ip) { try { URL url = new URL("http://opendata.baidu.com/api.php?query=" + ...

一火的专栏 9045

银河麒麟V10系统下VLC播放器安装全攻略(附3.0.9.2版本离线包下载)

本文详细介绍了在银河麒麟V10操作系统无网络环境下,从零开始编译安装VLC 3.0.9.2播放器的完整攻略。通过构建本地YUM仓库解决依赖问题,提供离线资源包下载,并逐步指导完成编译环境配置、软件编译与安装,帮助用户在国产麒麟系统上成功部署强大的多媒体播放能力。

a2b3c4d5e的博客 1211

Java 中是如何获取 IP 属地的

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

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

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1532

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细解析了企业微信群机器人的Webhook配置全流程,从创建机器人、获取关键Webhook地址,到使用代码发送文本、Markdown等多种消息类型。内容涵盖安全加固、错误处理及与CI/CD等系统集成的实战指南,帮助企业快速构建高效、稳定的内部通知系统。

ik678901的博客 1783

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

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

Javaの甘乃迪的博客 1万+

避坑指南:GROMACS模拟中.tpr、.xtc、.edr、.cpt文件你用对了吗?从生成到分析全流程解析

本文详细解析GROMACS分子动力学模拟中.tpr、.xtc、.edr、.cpt等核心文件的使用技巧,从文件生成到轨迹优化、能量分析的全流程避坑指南。重点介绍拓扑文件校验、轨迹格式选择、周期性边界处理等实战经验,帮助科研人员高效管理模拟数据并准确提取关键能量信息。

weixin_30631587的博客 118

教你用Java获取IP归属地

直接访问公网服务器地址能成功获取IP地址,但是通过Nginx反向代理获取的都是127.0.0.1。客户端请求Nginx服务器再反向代理转发到服务端,此时拿到的IP反向代理的IP,也就是Nginx服务器的IP,并不是真正的客户端IP。在本地环境调用获取IP,要么是0:0:0:0:0:0:0:1,或者是局域网IP。局域网IP是以192.168.x.x开头,或者是127.0.0.1的IP。通过IP获取归属地一般都从地址库找到匹配的地址,本文介绍两种方法.扫一扫,就能获取查到自己的归属地了。

萌兔兔MMQ!! 777

Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

Vue-高效简洁列表拖曳排序/鼠标拖动改变顺序排列组件支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无BUG列表拖曳排序插件vuedraggable拉动拽动拖动顺序改变排序js,vue.js,nuxt.js列表如何实现鼠标拖曳改变顺序排列支持滚动条内复杂数据对象带拖动效果动画排序完毕自动排列数组位置克隆Vue.Draggable官方文档教程SortableJS与vuedraggable列表拖动排序Vue拖拽组件库vuedraggable的安装与使用用户用鼠标拖动排序功能源码最好

🏆 前端领域优质创作者 4847

用MSBlock重塑C2f,让你的模型又轻又强(参数量与精度的双重突破)

打开确保模型解析器能识别MSBlock模块。通过将MSBlock集成到YOLOv8的C2f模块中,我们实现了一个“轻量且多尺度感知”的目标检测模型。这个改进不仅在工程上能降低部署成本、提升推理速度,更在科研上提供了“多尺度+动态核”的创新思路——这种思路可以延伸到其他网络(如ResNet、MobileNet)的改进中,帮你在论文中打造独特的研究点。如果你在实现过程中遇到问题,比如代码报错、训练收敛异常,可以先检查模块集成的每一步是否到位,再尝试调整MSBlock的卷积核尺寸、动态权重的计算方式等超参数。

m0_71589036的博客 105

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

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

m0_53062159的博客 7334

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

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

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

赏樱看雪撸代码 4701

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java获取IP及归属地

网络编程

m0_63823719的博客 4391

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java获取ip地址

1.介绍 需求:获取app端ip地址,并调用接口查询ip归属地。 bug:ip地址获取不一致。 2.ip归属地查询接口 淘宝API接口 http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 测试过了没用,一直返回 {"msg":"the request over max qps for user ,the accessKey=public","code":4} 太平洋IP地址查询 http://whois.pconline.co.

程序猿劝退师的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java程序获取手机ip和归属地的问题

public static String GetIP(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip ...

qq1301518841的博客 1570

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万+

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地址获取归属地

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

weixin_49128211的博客 2789
上一篇: 深入源码!详解MultipartFile
下一篇: 堪称2022年Java面试八股文天花板,(已助力512人入职大厂)
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值