目录

前言

获取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.1IP

所以需要部署到外网服务器才能获取到公网地址。部署到外网服务器能成功获取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 BootRestTemplate发起http请求,首先创建RestTemplatebean实例:

@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归属地相关推荐

  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 获取IP地址的工具类

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

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

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

  9. springboot获取IP归属地

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

  10. Java 获取ip地址、省份城市、城市ip

    1.获取ip :使用request.getHeader("x-forwarded-for")获取真实IP,x-forwarded-for的值并不止一个,而是一串IP值,获取为空时, ...

最新文章

  1. 【Java Web开发指南】有状态会话Bean(SLSB) 和无状态会话Bean(SFSB)的区别
  2. 插入,选择,归并,快速排序
  3. 23种经典设计模式的java实现_3_桥接模式
  4. access找不到输入表或者dual_数据表dual表的用途是什么?
  5. vue打包放到Java项目里_如何把vuejs打包出来的文件整合到springboot里
  6. 彩虹云任务极致精简版--PHPcron程序
  7. 微信公众平台PHP开发
  8. UIImagePickerController拍照与摄像
  9. Java SE 6之GUI:让界面更加绚丽(下)
  10. 大数据之-Hadoop3.x_MapReduce_WordCount编写_Driver---大数据之hadoop3.x工作笔记0091
  11. Android 视图(View)概述
  12. 灰度图像--频域滤波 概论
  13. 免费的Access数据库员工管理系统下载-IT技术网站 企业人员管理系统源码
  14. 帆软报表Tomcat 发布部署
  15. fw313r手机登录_2017最新迅捷(FAST)fw313r路由器手机设置教程
  16. Iptables-外网地址及端口映射到内网地址及端口
  17. 【Java基础】Lambda表达式的使用
  18. 色拉英语第2集第4幕: Cheers! ….hiccup
  19. 关于HTML字体出现模糊重影,点击后字体后变正常的情况与解决方法
  20. 关于抢红包的_面试官让我5分钟内写一个抢红包程序,我和他说了半小时原理!...

热门文章

  1. wamp mysql 密码_WAMP中的mysql设置密码
  2. mysql 创建事件_MySQL创建事件(CREATE EVENT)
  3. 奇虎360 2017校招笔试题
  4. 职称英语 计算机哪报名,职称计算机考试报名
  5. NBOJ 1184 Elaine's Queue deque的运用
  6. 北京药监局考试计算机操作,考科一电脑操作
  7. 台式计算机cpu品牌,台式电脑CPU天梯图2018年9月最新版 桌面CPU性能排名
  8. oracle 00314,【案例】Oracle报错ORA-00314 数据库异常关机导致redo SCN不一致无法启动...
  9. otn与stn网络_mstp和stn的区别
  10. 13个有意思的网站,你一定要看