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接口就是这样

http://whois.pconline.com.cn/

一般的跨域,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参数

不知道是哪位大佬做的,免费开放,这里先用着。

公网ip定位原理-心得的更多相关文章

  1. openGPS.cn - 高精度IP定位原理,定位误差说明

    [ip定位历史] 关于IP定位,最早是通过运营商实现,每个运营商申请到的ip段,在某个范围内使用. 因此早期只能是国家为单位的基础数据. 对于比较大的国家,就进一步划分,比如,中国某通讯公司(不打广告 ...

  2. 【杂谈】没有公网IP的电脑如何与外部通信

    前言 前几天突然想到的问题,自己先猜测推理了一番,最后在谢希仁版<计算机网络>找到了权威的解答.这里记录一下自己的思考过程. 网站是如何找到我们的? 我们知道,互联网中的两台电脑要进行通信 ...

  3. 利用端口映射解决:拥有公网IP有限,内网需要访问因特网

    动态端口映射:   内网中的一台电脑要访问新浪网,会向NAT网关发送数据包,包头中包括对方(就是新浪网)IP.端口和本机IP.端口,NAT网关会把本机IP.端口替换成自己的公网IP.一个未使用的端口, ...

  4. 解析私有IP地址和公网IP地址

    局域网私有IP地址上外网的原理 IP地址分为两部分,网络号和主机号,这种分法应用在私有和公有IP地址上.一个局域网中,为了该局域网的安全,我们应用了私有IP地址,为了和Internet中的其他主机进行 ...

  5. 外网訪问内网应用实现之无公网IP、多port、固定port、UDP等应用的实现方法

    有公网IP时,能够通过路由映射来实现外网訪问内网.然,当没有公网IP时,怎样实现外网訪问内网应用? 硬件路由方法因为无公网不可行,能够使用软件port映射的方法.如开放的NAT123全port映射. ...

  6. 自拉ADSL网线搭建站点server,解决动态IP、无公网IP、80port被封、HTTP被屏蔽的方法

    自己的server搭建站点应用,提供站点服务,能够不用备案,但可能会面对网络限制问题,如动态公网IP.无公网IP.80port被封.HTTP被屏蔽,这些复杂网络情况. 依据本地网络环境,能够针对不同的 ...

  7. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

    本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...

  8. Linux将公网ip映射到局域网ip

    测试环境如下: monitor: msc1:公网IP:103.6.164.128 eth0 内网IP:192.168.0.57 eth0内网IP:192.168.0.16 eth1 通过访问monit ...

  9. java调用高德地图api实现通过ip定位访问者的城市

    所需东西:高德地图的key 注意:这个key是 web服务的key  和js的key不是一个key(若没有则自行创建,创建教程在文末) 高德地图的api文档:https://lbs.amap.com/ ...

随机推荐

  1. 【MySQL】学生成绩

    统计每个人的总成绩排名 select stu.`name`,sum(stu.score) as totalscore from stu GROUP BY `name` order by totalsc ...

  2. Python连接MySQL数据库获取数据绘制柱状图

    一.Python通过pymysql包获取MySQL数据库中的数据(没有对应包的可以通过pip install pymysql 安装对应的包) import matplotlib.pyplot as p ...

  3. 转:addChildViewController实现网易新闻首页切换

    本来只是打算介绍一下addChildViewController这个方法的,正好今天朋友去换工作面试问到网易新闻标签栏效果的实现,就结合它,用个小Demo实例介绍一下:(具体解释都写在了Demo里面的 ...

  4. 09 - Vue3 UI Framework - Table 组件

    接下来做个自定义的表格组件,即 table 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 基于原生 table 标签的强语义 允许用户自定义表头.表体 可选是否具有边框 ...

  5. how2heap libc2.31学习

    今天是四月十九,想在五月份之前把how2heap中的高版本(2.31)的例子过一遍.所以这个系列目前还是在更新中.如果比较简单就几句话带过了,遇到难一点的会写的详细一点. fastbin_dup 源代 ...

  6. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  7. CF200B Drinks 题解

    Content 有 \(n\) 杯饮料,第 \(i\) 杯饮料中橙汁占 \(a_i\%\).现在请求出这 \(n\) 杯饮料混合成一杯饮料后的橙汁所占百分比. 数据范围:\(1\leqslant n\ ...

  8. Git差异并列显示

    默认的git diff命令只会将文件的修改差异使用"+","-"符号标注出来,并不直观. 最理想的方式应该是使用诸如"DiffMerge"这 ...

  9. vim操作(复制,粘贴)

    整行操作 单行复制 在"命令"模式下,将光标移动到将要复制的行处,按"yy"进行复制 多行复制 在"命令"模式下,将光标移动到将要复制的首行 ...

  10. git 添加.gitignore文件不生效

    git rm -r --cached . #新增的忽略文件没有生效,是因为git是有缓存的,而之前的文件在缓存中,并不会清除掉,还会继续提交,所以更新.gitignore文件,要清除缓存文件 git ...