偶然遇到这样的需求:只设置部分网段IP对当前网站的访问权限,
第一眼看到这个需求,我的第一反应是,这必然不是在前端来处理的,前端也处理不了。
随后网上查了一下,还真看到挺多这方面的资料:
1.网上有很多IP查询的入口,这里我们以搜狐入口为例,
2.设置我们可访问的ip列表IPList
3.查询本机IP,若不在IPList内,则强制退出,转至空页面
代码实现如下:
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>
var ip = returnCitySN["cip"];//获取本地IP
var allowIP = ['213.71.119.91', '213.71.119.92']; //允许访问ip列表
var flag = false;
for(var i=0; i<allowIP.length; i++){
if (ip == allowIP[i]){
flag = true;
break;
}
}
if(!flag){
alert("没有访问权限");
closewin();
}
function closewin() {
if (navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("Chrome") != -1) {
window.location.href = "about:blank";
window.close();
} else {
window.opener = null;
window.open("", "_self");
window.close();
}
}
</script>
备注:
这里需要注意,以上方法获取到的IP是公网IP(多人共用一个),一般公司局域网内我们常看到的用的Ip是内网IP(每台机器一个),
我们需要用的也是公网IP
应该也会有一些场景我们会需要用到内网IP,即本地IP,代码如下:
function findIP(callback) {
var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new myPeerConnection({iceServers: []}),
noop = function() {},
localIPs = {},
ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
key;
function ipIterate(ip) {
if (!localIPs[ip]) callback(ip);
localIPs[ip] = true;
}
pc.createDataChannel("");
pc.createOffer().then(function(sdp) {
sdp.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') < 0) return;
line.match(ipRegex).forEach(ipIterate);
});
pc.setLocalDescription(sdp, noop, noop);
});
pc.onicecandidate = function(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
};
}
findIP(function(ip){
let dom = document.getElementById('dom')
dom.innerHTML = ip + "你的本地IP地址"
});
以上,以此记录~
参考地址:
https://www.cnblogs.com/zixian/articles/allow_specify_IP_access.html
https://blog.csdn.net/aminwangaa/article/details/91879057