前几个月微信公众号上线了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归属地相关推荐

  1. apache代理时java获取IP的问题

    2019独角兽企业重金招聘Python工程师标准>>> x-forwarded-for的深度挖掘 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的 ...

  2. Java获取IP地址和VUE获取IP地址。

    java 获取 IP String ip = "";String address = "";try {// 获取IP地址ip = InetAddress.get ...

  3. java获取IP地址和MAC地址方式

    java获取IP地址和MAC地址方式 前端和后台都可以获取 ip获取方式比较简单,就不做分析了,主要说mac的获取 前端获取的方式与局限性:尝试好几种方式,这种是最易实现.最简单的方式,确实能获取该浏 ...

  4. 已知ip,如何利用python获取ip归属地

    可以使用第三方模块 "ipwhois" 来获取 IP 归属地信息.首先需要安装该模块,可以使用命令行运行: pipinstall ipwhois 然后,可以使用以下代码获取 IP ...

  5. Java获取IP及归属地

    最近我们发现各大社交平台都出现了一个新的功能:IP属地. 比如某乎: 这个IP属地是怎么做到的呢?今天我来教教你,保证你看完直呼Easy~ 技术栈 1.Java网络编程 2.Servlet 具体实现 ...

  6. Java获取IP以及地址属地(全网无BUG)

    点赞再看,养成习惯,大家好,我是辰兮!今天介绍如何获取访问人员的IP地址以及归属地(千万不要用这种方法做坏事噢!) 文章目录 思路 一.获取IP地址 二.获取归属地 三.测试 总结 思路 通过此网站: ...

  7. java 获取手机归属地_java 获取手机归属地

    java 获取手机归属地 [2021-01-30 20:46:44]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...

  8. Java 获取IP地址的工具类

    package cn.tolin.springboot.lab1.util;import javax.servlet.http.HttpServletRequest; import java.net. ...

  9. java获取IP地址,request.getHeader(“x-forwarded-for“)

    Nginx配置 前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付 ...

  10. springboot获取IP归属地

    在 Spring Boot 中获取 IP 归属地可以使用第三方 API 来实现. 一种方法是使用网络 API 来查询 IP 地址的归属地.例如,您可以使用淘宝的 IP 地址库 API(https:// ...

最新文章

  1. 【noi 2.5_8465】马走日(dfs)
  2. 精通python-轻松打造11周精通python计划(完结) | 软件库
  3. ios重签名iReSign
  4. java电子商务源码解读 b2b2c o2o
  5. 985毕业+数据分析师+做过名企项目+懂运营=跳槽失败???
  6. 演练-使用xapth与lxml库进行操作-0223
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的足球联赛管理系统
  8. IDEA 设置文档注释
  9. 解决TeamViewer的“现在无法捕捉画面。可能由于快速切换或者远程桌面断开或者最小化”问题...
  10. 数据分析从入门到进阶,35本包邮送到家
  11. ROS2 Galactic nav2 使用自己的行为树插件
  12. HTMLTestRunner修改Python3的版本
  13. 单源最短路(spfa+Dijkstra)附数据
  14. perl语言hello world程序
  15. C语言贪吃蛇 新手入门(超详细)
  16. 网络信息安全风险评估
  17. learun敏捷框架工作流:企业效率助推神器
  18. android 8.0图标适配
  19. 学校设备保修维修工单小程序开发制作
  20. 安徽计算机在职研究生学校,安徽能读在职研究生有哪几个学校

热门文章

  1. es7之Reflect Metadata
  2. 单片机课程设计题目及要求——电风扇模拟控制系统(仿真图加代码加原理图都有)
  3. 无线网络dns服务器设置,无线网络的dns怎么设置才正确
  4. php中根据数字月份返回月份的英文缩写
  5. Word文档怎么添加删除线
  6. Emeditor -- windows最强txt编辑器,没有之一
  7. nohup与前台后台操作
  8. 迪杰斯特拉算法(求最短路径)
  9. [期货系列]期货择时策略-基于Hurst指数的分型策略研究
  10. 吉首大学校赛 A SARS病毒 (欧拉降幂)