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接口

  1. <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. windows下更换MySql数据库数据文件夹位置

    详细解决地址 ,感谢博主  :https://blog.csdn.net/u010953266/article/details/56499361 概述 由于更换硬盘,系统重新安装了一遍,原来的mysq ...

  2. uWSGI和WSGI之间的关系

    一.WSGI 协议 WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等.但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就 ...

  3. Gitlab-CICD实践篇

    一.背景 随着公司项目使用gitlab越来越多,业务发布的次数越来越频繁,对于发布效率提出了更高的要求.从2012开始,Gitlab官方开始集成了Continuous Integration (CI) ...

  4. MySQL 面试题汇总(持续更新中)

    COUNT COUNT(*) 和 COUNT(1) 根据 MySQL 官方文档的描述: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) opera ...

  5. [BUUCTF]PWN20——ciscn_2019_n_5

    [BUUCTF]PWN20--ciscn_2019_n_5 附件 步骤: 例行检查,64位,没有开启任何保护 试运行一下程序,看看程序的执行情况 64位ida载入,找到main函数, 逻辑很简单,第一 ...

  6. Java中List排序的3种方法

    在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作.比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进 ...

  7. AT4151 [ABC099B] Stone Monument 题解

    Content 一个村里有 \(999\) 个房子,第 \(i\) 个房子的高度为 \(1+2+...+i=\sum\limits_{j=1}^ij\).现在下了一场雪,给定相邻两个房子没被雪覆盖的高 ...

  8. axiso 高级封装

    ​ import axios from 'axios'; import qs from 'qs'; const Unit = { async getApi(ajaxCfg){ let data = a ...

  9. 经验:如何使用replace而不丢失数据

    背景:replace很好用,的应用场景比较多,但是直接使用可能会造成一引起字段的值丢失. 解决方法: 一.原始数据 select id,f1,f2 ,flag from update_test; id ...

  10. 总结Vue 第四天:vue-cli(Vue2.0 新手入门 — 从环境搭建到发布)

    总结Vue 第四天:vue-cli(Vue2.0 新手入门 - 从环境搭建到发布) 一.Vue CLI----(Vue2.0 新手入门 - 从环境搭建到发布): ■   CLI是Command-Lin ...