今天在项目中遇到一个前端唯一标示的问题,特此记录一下。
项目的系统架构如下:
整个网络环境分为内网环境和外网环境两个部分,内网的用户客户端1和客户端2通过双网卡前置机的代理访问外部公网环境的网站,外网环境的客户端3和客户端4直接访问外网的网站。
网站中有个界面只允许内网用户访问,如何解决?(访问该页面时,Web会进行一个自动登录操作,如果登录成功了则正常获取页面数据进行显示)
方法一:后台对该界面增加IP地址过滤
由于内网用户发起的网络请求通过Nginx代理最后都是以相同的IP请求服务器,所以后台可以增加IP地址白名单,如果请求IP是前置机的公网IP,则返回登录成功,允许访问该页面,如果不是白名单中的IP,则返回登录失败,不允许访问该页面。
方法二:前端发起网络请求时增加唯一标识
在原生Android App中,我们经常使用设备IP地址、MAC地址等等作为移动设备的唯一标识,或者通过短信验证等方式,所以团队中有人提出了方案二。虽然方案二和方案一本质上一样,都是对IP地址进行过滤,但是还得记录一下,因为方案二实现时遇到一些问题。
问题就是
JS如何获取本地客户端的唯一标识,或者说如何获取本地客户端的IP或者MAC地址?
答案可能令人比较失望,就是
前端JS没有办法获取到本地客户端IP或者MAC地址
。
当然有一些迂回的方法可以一定程度上实现,特此记录下:
(1)IE浏览器下通过ActiveX的方法
该方法的局限性不言而喻,就是必须限定浏览器为IE,而且需要手动启动ActiveX。
(2)通过第三方API获取公网IP
可以通过第三方的IP地址查询接口获取到客户端的公网IP,该方法的局限性在于仅仅只能获取到公网IP。
(3)通过webRTC获取本地IP
该方法的原理是通过建立webRTC (网页即时通信,Web Real-Time Communication)连接,在连接中获取客户端本地IP,局限性在于相对麻烦。
备忘
:
1、如何查看PC的本地IP和公网IP?
本地IP通过ipconfig查看即可,其中的IPV4地址即为本地IP,如下图:
公网IP可以在百度中“IP地址”快速查看,如下图:
2、公网IP和本地IP的区别?
什么是公网IP?