外包项目,前后端分离,前端纯 H5,打包后放到指定的 app 里,类似微信小程序;
后台部署在对方内部服务器,前端通过内网地址向后台发起请求,手机需要连接内网 wifi 才能使用该小程序。
对方要求手机连外网时也能使用,于是找对方申请外网访问权限,通过端口映射访问内网;
前端改成 公网 ip+端口 请求后台,结果手机连外网可以使用,内网就用不了了…
项目经理在群里 @我(前端)让我解决问题:判断当前手机连的网络是内网还是外网,内网用内网地址,外网用外网地址。
我一下子就懵了,这前端能做得到吗?
一开始想到的是通过 ajax 请求超时来判断,但这样子从进入首页到请求超时这段时间页面就没数据显示了;
目前的解决方法是进入首页后先同时向内外网地址发起请求,哪个先响应后续的所有请求就用该地址;
总感觉这样不妥,后续业务扩展这问题可能还会暴露出来;
我觉得这问题不该由前端来解决,但跟项目经理解释不清,所以想请教下,纯前端要怎么判断当前网络是内网还是外网?
1
leo108 2019-03-08 16:52:53 +08:00
调用 API 的思路没有问题,只要同时发起两个 API 请求即可,哪个先返回正确的数据就知道是哪个网咯。
|
2
nfroot 2019-03-08 17:27:23 +08:00
内网是啥?外网是啥?你分得清么?
估计你也分不清,其实哪来的内网,哪来的外网…… 你这个需求明明是“我在 XXX 企业内网”和“我不在 XXX 企业内网”,一般人连内网外网都分不清,哪来的区分啊,还得判断是不是在指定的内网。 简单来说 2 种解决办法吧: 1.这个东西应该在对方企业的路由或三层交换机上指定策略路由、路由,没走错接口,内网外网都应该是可以访问到该企业的外网 IP。程序上不需要区分什么内网外网。不应该存在不能访问的情况。存在不能访问的情况,就是路由、策略路由设置错啦。把那个搞 IT 的抓起来打屁股。 2.在你的 WEB 目录下放一个极小的图片,我用 PS 做了个 1 像素的图片,才 49 字节!!!开启程序的时候同时加载 2 个地址的这个图片,谁先加载成功,就走哪个,这个不难吧?而且延迟也会很小!还搞什么 ajax,太麻烦了!直接搞 2 个 img,谁先 onload 就走谁。简单吧? PS:这个工作说起来不是你前端做,但是后端更是做不了的。。。。其实根本的原因就是它是网络设置错了才会这样 |
3
nfroot 2019-03-08 17:32:17 +08:00
作为一个主职管 ERP 的,二三层交换懂一点,桌面运维懂一点,数据库懂一点,前端懂一点,后端也懂一点,工厂怎么运作的懂一点,财务也懂一点。。。
也是个蛋疼 |
4
zenxds 2019-03-08 17:36:45 +08:00
用 we'brtc 采集到当前的 IP,然后根据格式判断是内网还是外网
|
6
maichael 2019-03-08 17:56:06 +08:00
你这种方法我觉得没有问题,你可以把判断内外网封装成一个方法,然后写成用 promise.all 之类的并且写成阻塞的方式,在页面刚进入的时候做这操作就好了,不影响扩展性。
|
7
kisara 2019-03-08 17:57:47 +08:00
很简单 在公网架设一个服务器 从本机获取一下 ip 在从服务器上查询一下本机 ip 看看一致不一致就行了
|
8
Yourshell 2019-03-08 17:59:46 +08:00
改下内网 DNS 不就好了么
|
10
ASpiral OP @nfroot 就是分不清所以来发问啊…我找对方管理网络的人求助,他跟你一样说一堆我不了解的专业名词,最后怪我水平不行让我找其他前端解决…
|
11
gamexg 2019-03-08 18:59:33 +08:00 via Android
两个都试试,哪个能用用哪个。
另外内网无法用外网地址,应该是对方路由未设好。 |
12
yhxx 2019-03-08 19:11:01 +08:00
改域名解析不能解决吗?
|
13
580a388da131 2019-03-08 20:23:25 +08:00 via iPhone
既然是放在 app 里面,要求 app 传递一下网络情况不就好了?
|
14
cpdyj0 2019-03-08 21:27:55 +08:00
这叫啥需求,应当甩锅给网管……
|
15
Jex 2019-03-08 21:30:05 +08:00
|
16
nfroot 2019-03-08 21:51:16 +08:00 1
@ASpiral
1.正常来说,既然公网 IP 映射了端口,那就必然能在所有联了互联网的机器访问,包括任何公司、家联网的设备。你说的对方内网访问不了,这是不合理的,除非是被内部限制了网络,不准上网的机器(这种就只能靠你去解决了,就比如你主题中的方法,再优化也差不多,就是这样了,别想了,再想也无用,后端也没办法解决,只有你解决) 2.无限制的情况下,只能是路由 /策略路由指错了接口,否则根本就不存在访问不了的情况。这个就要对方管网络的去解决。但是你的主题里没有提到这部分。 3.上面有一些错误的回复。或者说通过更复杂的技术,但反而很难准确判断,原因我前面的回复也说了。 |
17
ThirdFlame 2019-03-08 22:36:20 +08:00
显然是出口设备(简称路由器) ,对于内网设备访问路由器 wan 口映射地址时出错导致的。 此问题 已知华为部分防火墙就有,而且无法解决。
总的来说 属于网络问题,非前端 /后端问题。 |
20
ASpiral OP @ThirdFlame 前端显示不出数据,项目经理就认为是前端的问题,我对网络这块不了解没办法跟经理解释清楚,感觉做外包沟通好麻烦= =
|
21
myzyq 2019-03-08 23:27:22 +08:00 via iPhone
感觉域名解析靠谱!
|
22
Acoffice 2019-03-08 23:41:33 +08:00 via Android 1
@ASpiral 你内外网访问地址不一致?比如外网访问是 112.x.x.x:8080 内网直接访问 192.168.1.2 ?
----- 正常来说,如果内外端口一致,内网有上网权限,是不会访问不了的. 域名同理,如果内网有 DNS 服务器,且指定了域名对应的内网地址,那内网无上网权限也没有影响. |
23
autoxbc 2019-03-09 00:08:52 +08:00 1
这个问题的术语叫 NAT 回流,对方好沟通的话让网管处理
|
25
aunox 2019-03-09 11:01:47 +08:00
前提:在内网时,不能访问外网。
在第三方不给你提供帮助的情况下,#2 的解决方案里面第二种是比较靠谱的。只要判断内网图片能不能访问就行了,内网 IP 路由没几跳,这个错误响应速度是很快的,对于使用者来说应该是无感知的,公网下载图片就不要测试了。 |
26
sampeng 2019-03-09 18:53:04 +08:00 via iPhone
这明显要甩锅给甲方的网络环境…关你们屁事昂。合同有写么
|