1.前言
正在做一个根据公网ip来定位到大体的位置,一般是精确到城市或地区,
如果想要精确到街道和地图一一对应,那得使用GPS才可以,这里不讨论。
2.科普
公网也就是外网,由运营商的机房服务器自动给每一个用户分配一个IP地址,
每次登录上网它都会自动分配一个,如果是专线如光纤上网,那外网IP就是电信给固定IP,是不会变。
我们的设备一般都是在一个区域内,共同使用一个公网ip,而我们则使用该公网ip下分的子接口,不同的接口还可以设置不同的内网,也就是家里的wifi等局域网。
维度公网ip被划分后则不可变的,是固定位置的,因此可以作为定位功能的依据。
3.网上博客流行ip定位方式分三种:
方式一:前端访问第三方网址,无需ip参数,返回结果为该设备浏览器的公网ip地理信息;
缺点: 可能会遇到跨域访问服务器拒绝处理的问题,报错代码403;
优点:速度快;
方式二:前端访问第三方网址,需要指定ip参数,一般是ipv4,或者设备浏览器的经纬度,
返回结果为该指定ip参数的地理信息。
缺点: 可能会遇到跨域访问服务器拒绝处理的问题,报错代码403;
优点:速度快;
【
那么,这就需要提前获取ip参数,获取方式有两种,
第一:访问第三方网址,返回公网ip参数,(需要第三方网址服务器允许前端跨域访问才可以);
第二,前端访问自己的服务器,服务器解析前端请求获取公网ip参数。
】
方式三:访问自己的服务器,根据前端的公网ip参数,由服务器访问第三方网址,这样就不会遇到跨域403问题,但是,也有可能会遇到中文乱码,
需要提前手动调制
缺点:代码量大,查询速度慢,还有时候第三方服务器拒绝频繁访问,比如淘宝的接口,这就很蛋疼了;
优点:无跨域问题;
【如果不会服务器java访问网址,看这篇博客介绍:https://www.cnblogs.com/charles8866/p/11162157.html】
4.探讨第三方网址服务器的实现原理
上诉三种方法,其实归根结底都是需要访问第三方网址的服务器,等待它的处理结果,没有给ip参数它就提取出发送请求
的浏览的的公网ip来查询地理位置,如果有指定的ip参数则使用该参数查询,然后根据ip参数,转换成长整数,
(ip转换成长整数的方法这里不细说了,有兴趣的看他的这篇博客:https://www.iteye.com/blog/aokunsang-622498),
以长整数为查询条件,去ip地址数据库里查询这个长整数的范围就可以获取对应的地理信息和提供的运营商,【ip地址数据库因为每天都有局部变化,但是大体的是稳定不变的,所以网上只能找到更全的,而没有全部的IP地址数据库】,
查询结果进行总结,然后一般使用json串的形式返回给请求端。
5.震惊
是不是很不可思议,就是这么简单,而我们缺少的,正是这个ip地址库,淘宝上有得卖,一般70块钱左右!!!!
给的文件一般是access数据库,当然,我们可以自己转成自己使用的数据库,如redis、mysql、oracle等,也可以录入xml等文件,根据需要使用。
6.思考
其实,自己也可以制作一个ip服务接口,其实核心就是个查询IP地址数据库的操作而已,但是,我觉得没这个必要,因为我只是想要
大体定位前端在哪个省哪个市哪个地区而已,就这么一个小功能,又不是商用, 没必要花那么多钱买一个数据库然后自己做一个查询功能,
还不如使用别人的第三方免费接口,内容简洁,速度还快,还可以分担自己服务器的负担,何乐而不为?
【虽然可以免费下载IP地址数据库,但是一般不全面,还不好找】
7.网页跨域问题
服务器其实可以设置防止外链的使用权限,可以让浏览器跨域永远403失败!!!但是直接用浏览器访问网址 却可以正常使用,我苦难研究了一天才弄明白,
解决方法则是在服务端里进行url访问,这样没不会出现这种跨域问题,太平洋网ip接口就是这样
。
一般的跨域,ajax 和 <script src="http://xxx.xxx.xxx"></script> 这两种方法都可以访问,
比如使用搜狐的ip访问接口
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
还有其他的方法,详细的看这个博客: https://www.cnblogs.com/wws-bk/p/9770875.html
8.最后的妥协
考虑再三,希望查询速度快,允许高频率查询,准确性高,关键是免费!!!
因此,我选择用第三方网址IP接口
<script src="http://ip.ws.126.net/ipquery"></script>
测试返回结果:
很不错!
也可以指定ip参数
不知道是哪位大佬做的,免费开放,这里先用着。