判断当前请求的网络是内网还是外网
1.场景分析
最近有个需求,有个功能只能让外网用户使用,内网用户无感,并且是在同一个引用中,那么我就需要在初始化的时候,对当前用户的IP进行判断,看看这个IP是否可以访问内网
2.前端实现
前端实现就一个思路,用AJAX调用一个只有内网可以访问的到的数据或者接口。如果超时了,那么就是外网。
//代码主体
ping = (address,callback) =>{var img = new Image();var start = new Date().getTime();//一张内网图片 用来判断网络类型 外网是加载不到这个图片的img.src =address+"?time="+start;var flag = false;img.onload = function(){flag = true;//在2秒内 加载出图片 那么就认定为是内网console.log("内网网络")}var timer = setTimeout(function(){if(!flag){flag = false;if (callback && typeof callback == 'function') callback();}},2000);
}
//使用回调函数触发我们的事件this.ping("http://neiwang.com/static/img/4345wee68dsfsd.png",()=>{ //只有外网才会执行这个回调alert("我是外网")
})
代码很简单,只要在定时器到达之前响应我们信息,那就是内网,但是存在一个很严重的风险
假如用来校验内网的那个资源被删了或者接口挂了,那么我们的全部IP都会视为外网,因为你统统都超时了。或者假如我们网络震荡,或者加载的资源很大,也会造成问题。所以想用这个办法一定要保证,用来校验的资源或者接口一定要很快,资源保证不会被误删。最好专门写一个接口或者一个小图片来做接口超时的判断。不要随便哪一个好几十M的图片,万一网络炸了就完蛋了。
3.后端实现
public static boolean test() throws IOException {String ip = "apaddress";Runtime runtime = Runtime.getRuntime(); // 获取当前程序的运行进对象Process process = null; //声明处理类对象String line = null; //返回行信息InputStream is = null; //输入流InputStreamReader isr = null;// 字节流BufferedReader br = null;boolean res = false;// 结果try {process = runtime.exec("ping " + ip); // PINGis = process.getInputStream(); // 实例化输入流isr = new InputStreamReader(is);// 把输入流转换成字节流br = new BufferedReader(isr);// 从字节中读取文本while ((line = br.readLine()) != null) {//这里一定要转大写 因为在linux系统中,是小写的 要兼容系统就加上if (line.toUpperCase().contains("TTL")) {res = true;break;}}if (res) {return true;} else {return false;}} catch (IOException e) {runtime.exit(1);return false;} finally {if (is != null) {is.close();}if (isr != null) {isr.close();}if (br != null) {br.close();}}}
我个人更加倾向于用后端去实现,这个只需要使用IP即可,无需其他资源,更加安全。
4.注意事项
如果使用后端方式的小伙伴注意,因为java模拟PING请求,如果通不了的话可能会造成长时间的卡顿,因为获取请求的方式是while循环,存在卡顿的情况。所以在调用这个接口的时候,ajax一定要加上超时时间。避免无线等待造成其他问题。
参考代码如下:
ipAddressPing = (ip,callback,timeout=2000)=>{$.ajax({url:'/api/demo/ipAddressPing?ipAddress='+ip,type:'get',timeout:timeout, //设置超时的时间2ssuccess:function(res){console.log(res)//请求没超时,但是PING不通,也说明是外网 需要调用接口 这里具体的你们自行判断if (!res) { if (callback && typeof callback == 'function') callback(res);}},error:function(err){console.log(err)//请求超时说明 外网 需要调用接口if (callback && typeof callback == 'function') callback(res);}})}
判断当前请求的网络是内网还是外网相关推荐
- dcn网络与公网_ip 中的,内网,外网,公网,dcn网络,分别是什么意思?
展开全部 ip中的,内网62616964757a686964616fe78988e69d8331333433646465,外网,公网,dcn网络,分别是: 1.内网ip: 内网也就是局域网,内网的计算 ...
- 网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?
相信很多人都不知道内网.外网.宽带.带宽.流量.网速之间的区别与联系,今天小编给大家介绍一下,希望对大家能有所帮助! 一.带宽与宽带的区别是什么? 带宽是量词,指的是网速的大小,比如1Mbps的意思是 ...
- 11-20什么是内网,外网,局域网,如何判断
内网就是我们平常说的局域网.局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组.它可以是邻居之间的2台电脑,也可以是一幢100层大楼里的1000台电脑.局 ...
- 内网和外网的区别是什么?
内网和外网的区别重要依据主要是判断它是不是与广阔的外界相连. 内网和外网最大的区别 内网IP局域网,网线都是连接在同一个 交换机上面的,也就是说它们的IP地址是由交换机或者路由器进行分配的.而且每一个 ...
- 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS
1 https协议 https://www.cnblogs.com/superfeeling/p/11561340.html https://www.cnblogs.com/an-wen/p/1118 ...
- 内网IP外网IP的关联及访问互联网原理
首先解释一下"内网"与"外网"的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的.但两个局域网内 ...
- IP、内网、外网、私网、公网、子网掩码、默认网关的概念解析
本文梳理一下网络基础中的一些重要概念. 一.IP IP(Internet Protocol,网际互连协议)地址就是给每个连在Internet网的主机分配一个在全世界范围内唯一的标示符,Internet ...
- mac电脑连接内网和外网的方法(添加路由)
mac电脑连接内网和外网的方法 172.21.0.0网段的IP走172.21.218.1网关(路由器) 192.168.0.0网段的IP走10.172.224.221网关(路由器) 这样设置就不用改变 ...
- 了解内网、外网、宽带、带宽、流量、网速
了解内网.外网.宽带.带宽.流量.网速. 一.带宽与宽带的区别是什么? 带宽是指在单位时间内(1秒)内能传输的数据量.网络和高速公路类似,带宽越大,就类似高速公路的车道越多,其通行能力越强.把城市的道 ...
最新文章
- Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
- 手机软件:杀手游戏的法官助手,(人多的时候法官没有辅助,是很难记住各个角色的)...
- 大剑无锋之hadoop默认的数据类型都有哪些?
- Replace Parameter with Explicit Methods(以明确函数取代参数)
- IOC操作Bean管理注解方式(创建对象)
- SpringCloud Gateway 快速入门_01
- usermod使用方法
- hadoop(八) - hbase集群环境搭建
- 不使用border-radius,实现一个可复用的高度和宽度都自适应的圆角矩形
- leetcode-22-括号生成
- 传智播客Java 方法
- keras实现声音二分类
- 电容笔做的比较好的品牌有哪些?便宜好用的电容笔推荐
- 移动APP集成支付宝--服务器端设计
- Typora自动上传图床配置
- 能上QQ但不能上网问题精解
- RabbitMQ内存消耗
- “战”在新高地,星沙加“数”前行
- 销售开票税价错误,修改方式!
- 壹佰智能名片v1.2.10