最近,继新浪微博之后,今日头条、腾讯、抖音、知乎、快手、小红书、百家号等各大平台陆陆续续都上线了" 网络用户IP地址显示功能 ",境外用户显示的是国家,国内的用户显示的省份,而且此项显示无法关闭,归属地强制显示;
作为技术人,那!这个功能要怎么实现呢?
其实要想实现这个功能还是非常的容易,基于现成 GeoLite2离线库+免费的在线解析资源,5分钟就能整合了;
在整合之前,我们先简单了解一下,要想拿到用户的位置信息,有那些方式:
终端定位
我们的手机等电子设备都是带有GPS定位功能的,APP可以申请权限获取用户所处的经纬度坐标,根据坐标,就可以知道到用户所处的位置;比如百度、高德等地图厂商,就提供了完善的SDK,能非常方便的集成到应用,快速根据经纬度获取详细的位置详细;
优点
缺点
IP地址解析
用户向服务端发起的请求都会带上IP地址,服务端拿到IP地址后,就能基于IP解析出用户的所处的位置;
优点
缺点
三方终端上报
比如,我们骑共享单车的时候,我们的位置信息就是通过单车的设备上报到服务器;
优点
缺点
下面就来试着将 GeoLite2 免费 IP 库整合值SpringBoot项目,来获取用户的归属地信息;
GeoLite2数据库是免费的IP地理定位数据库;
优点:
缺点:
官网地址:https://www.maxmind.com/en/home
下载过程稍微有点点麻烦,这里下载了一份最新的,放在网盘,需要测试的可以直接通过这个链接下载:https://www.123pan.com/s/xPY9-J37vH
就这么简单,轻轻松松就能拿到用户IP所处的国家、省份、城市、经纬度等详细信息,可以根据自己的业务需要,对这些数据再做进一步的封装。
上面介绍的时SpringBoot整合GeoLite2,同样在其他的一些场景下,也是可以利用GeoLite2获取归属地信息;
上面一开始介绍GeoLite2时就列举了其离线库更新收录不及时的问题,可能导致一些IP在离线库中并不存在,查找的时候,就会报 AddressNotFoundException 的错误,如下示例:
遇到这种请求,我们要怎么办呢?
下面就来介绍几种在线IP归属地获取的方式,当本地离线库无法获取的时候,就可以利用三方的在线库,来补充完善;
在线获取的优点:
缺点
以下示例中的xxx.xxx.xxx.xxx均代表ip地址;
地址:https://opendata.baidu.com/api.php?query=xxx.xxx.xxx.xxx&resource_id=6006&co=&oe=utf8
响应数据:
status等于0表示成功,1表示失败;可能存在status等于0,但是data中没有数据的情况。
地址:http://pv.sohu.com/cityjson?ie=utf-8
返回数据比较的简单:
地址:http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true
返回数据:
http://ip.taobao.com/service/getIpInfo.php?ip=xxx.xxx.xxx.xxx
code等于0表示成功,1表示失败
地址:https://ip.ws.126.net/ipquery?ip=xxx.xxx.xxx.xxx
响应数据:
响应的数据比较的简单
地址:https://ip.useragentinfo.com/json?ip=xxx.xxx.xxx.xxx
响应数据:
这么多的姿势,实现起来是不是就非常的容易了;如果你对IP解析的需求比较依赖,也完全可以通过离线加这么多在线的方式,开发一个单独的IP解析模块,作为公司的基础服务,提供给内部其他模块使用。
示例目录:https://github.com/vehang/ehang-spring-boot/tree/main/spring-boot-004-request-validate/src/main/java/com/ehang/validate/geoip
来源:公众号—— 一行Java