教你用Java获取IP归属地
前几个月微信公众号上线了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依赖:
org.lionsoul ip2region 2.6.5 获取归属地:
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|广东省|广州市|电信。
小程序效果展示
根据上面的程序,做了一个小程序展示归属地。
页面效果图:
扫一扫,就能获取查到自己的归属地了。
教你用Java获取IP归属地相关推荐
- apache代理时java获取IP的问题
2019独角兽企业重金招聘Python工程师标准>>> x-forwarded-for的深度挖掘 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的 ...
- Java获取IP地址和VUE获取IP地址。
java 获取 IP String ip = "";String address = "";try {// 获取IP地址ip = InetAddress.get ...
- java获取IP地址和MAC地址方式
java获取IP地址和MAC地址方式 前端和后台都可以获取 ip获取方式比较简单,就不做分析了,主要说mac的获取 前端获取的方式与局限性:尝试好几种方式,这种是最易实现.最简单的方式,确实能获取该浏 ...
- 已知ip,如何利用python获取ip归属地
可以使用第三方模块 "ipwhois" 来获取 IP 归属地信息.首先需要安装该模块,可以使用命令行运行: pipinstall ipwhois 然后,可以使用以下代码获取 IP ...
- Java获取IP及归属地
最近我们发现各大社交平台都出现了一个新的功能:IP属地. 比如某乎: 这个IP属地是怎么做到的呢?今天我来教教你,保证你看完直呼Easy~ 技术栈 1.Java网络编程 2.Servlet 具体实现 ...
- Java获取IP以及地址属地(全网无BUG)
点赞再看,养成习惯,大家好,我是辰兮!今天介绍如何获取访问人员的IP地址以及归属地(千万不要用这种方法做坏事噢!) 文章目录 思路 一.获取IP地址 二.获取归属地 三.测试 总结 思路 通过此网站: ...
- java 获取手机归属地_java 获取手机归属地
java 获取手机归属地 [2021-01-30 20:46:44] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...
- Java 获取IP地址的工具类
package cn.tolin.springboot.lab1.util;import javax.servlet.http.HttpServletRequest; import java.net. ...
- java获取IP地址,request.getHeader(“x-forwarded-for“)
Nginx配置 前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付 ...
- springboot获取IP归属地
在 Spring Boot 中获取 IP 归属地可以使用第三方 API 来实现. 一种方法是使用网络 API 来查询 IP 地址的归属地.例如,您可以使用淘宝的 IP 地址库 API(https:// ...
最新文章
- 【noi 2.5_8465】马走日(dfs)
- 精通python-轻松打造11周精通python计划(完结) | 软件库
- ios重签名iReSign
- java电子商务源码解读 b2b2c o2o
- 985毕业+数据分析师+做过名企项目+懂运营=跳槽失败???
- 演练-使用xapth与lxml库进行操作-0223
- 基于JAVA+SpringBoot+Mybatis+MYSQL的足球联赛管理系统
- IDEA 设置文档注释
- 解决TeamViewer的“现在无法捕捉画面。可能由于快速切换或者远程桌面断开或者最小化”问题...
- 数据分析从入门到进阶,35本包邮送到家
- ROS2 Galactic nav2 使用自己的行为树插件
- HTMLTestRunner修改Python3的版本
- 单源最短路(spfa+Dijkstra)附数据
- perl语言hello world程序
- C语言贪吃蛇 新手入门(超详细)
- 网络信息安全风险评估
- learun敏捷框架工作流:企业效率助推神器
- android 8.0图标适配
- 学校设备保修维修工单小程序开发制作
- 安徽计算机在职研究生学校,安徽能读在职研究生有哪几个学校