Java获取IP归属地
目录
前言
获取IP地址
Nginx 反向代理问题
IP获取归属地
通过归属地API获取
通过地址库获取
前言
前几个月微信公众号上线了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 {@Beanpublic 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
地址定位库,微秒的查询时间:
首先找到地址库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;@Overridepublic 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 获取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:// ...
- Java 获取ip地址、省份城市、城市ip
1.获取ip :使用request.getHeader("x-forwarded-for")获取真实IP,x-forwarded-for的值并不止一个,而是一串IP值,获取为空时, ...
最新文章
- 【Java Web开发指南】有状态会话Bean(SLSB) 和无状态会话Bean(SFSB)的区别
- 插入,选择,归并,快速排序
- 23种经典设计模式的java实现_3_桥接模式
- access找不到输入表或者dual_数据表dual表的用途是什么?
- vue打包放到Java项目里_如何把vuejs打包出来的文件整合到springboot里
- 彩虹云任务极致精简版--PHPcron程序
- 微信公众平台PHP开发
- UIImagePickerController拍照与摄像
- Java SE 6之GUI:让界面更加绚丽(下)
- 大数据之-Hadoop3.x_MapReduce_WordCount编写_Driver---大数据之hadoop3.x工作笔记0091
- Android 视图(View)概述
- 灰度图像--频域滤波 概论
- 免费的Access数据库员工管理系统下载-IT技术网站 企业人员管理系统源码
- 帆软报表Tomcat 发布部署
- fw313r手机登录_2017最新迅捷(FAST)fw313r路由器手机设置教程
- Iptables-外网地址及端口映射到内网地址及端口
- 【Java基础】Lambda表达式的使用
- 色拉英语第2集第4幕: Cheers! ….hiccup
- 关于HTML字体出现模糊重影,点击后字体后变正常的情况与解决方法
- 关于抢红包的_面试官让我5分钟内写一个抢红包程序,我和他说了半小时原理!...
热门文章
- wamp mysql 密码_WAMP中的mysql设置密码
- mysql 创建事件_MySQL创建事件(CREATE EVENT)
- 奇虎360 2017校招笔试题
- 职称英语 计算机哪报名,职称计算机考试报名
- NBOJ 1184 Elaine's Queue deque的运用
- 北京药监局考试计算机操作,考科一电脑操作
- 台式计算机cpu品牌,台式电脑CPU天梯图2018年9月最新版 桌面CPU性能排名
- oracle 00314,【案例】Oracle报错ORA-00314 数据库异常关机导致redo SCN不一致无法启动...
- otn与stn网络_mstp和stn的区别
- 13个有意思的网站,你一定要看