ASpiral
V2EX  ›  问与答

前端怎么判断当前连接的网络是内网还是外网?

  •  
  •   ASpiral · Mar 8, 2019 · 6933 views
    This topic created in 2648 days ago, the information mentioned may be changed or developed.

    外包项目,前后端分离,前端纯 H5,打包后放到指定的 app 里,类似微信小程序;
    后台部署在对方内部服务器,前端通过内网地址向后台发起请求,手机需要连接内网 wifi 才能使用该小程序。

    对方要求手机连外网时也能使用,于是找对方申请外网访问权限,通过端口映射访问内网;
    前端改成 公网 ip+端口 请求后台,结果手机连外网可以使用,内网就用不了了…
    项目经理在群里 @我(前端)让我解决问题:判断当前手机连的网络是内网还是外网,内网用内网地址,外网用外网地址。
    我一下子就懵了,这前端能做得到吗?

    一开始想到的是通过 ajax 请求超时来判断,但这样子从进入首页到请求超时这段时间页面就没数据显示了;
    目前的解决方法是进入首页后先同时向内外网地址发起请求,哪个先响应后续的所有请求就用该地址;
    总感觉这样不妥,后续业务扩展这问题可能还会暴露出来;
    我觉得这问题不该由前端来解决,但跟项目经理解释不清,所以想请教下,纯前端要怎么判断当前网络是内网还是外网?

    26 replies    2019-03-09 18:53:04 +08:00
    leo108
        1
    leo108  
       Mar 8, 2019
    调用 API 的思路没有问题,只要同时发起两个 API 请求即可,哪个先返回正确的数据就知道是哪个网咯。
    nfroot
        2
    nfroot  
       Mar 8, 2019
    内网是啥?外网是啥?你分得清么?

    估计你也分不清,其实哪来的内网,哪来的外网……

    你这个需求明明是“我在 XXX 企业内网”和“我不在 XXX 企业内网”,一般人连内网外网都分不清,哪来的区分啊,还得判断是不是在指定的内网。

    简单来说 2 种解决办法吧:
    1.这个东西应该在对方企业的路由或三层交换机上指定策略路由、路由,没走错接口,内网外网都应该是可以访问到该企业的外网 IP。程序上不需要区分什么内网外网。不应该存在不能访问的情况。存在不能访问的情况,就是路由、策略路由设置错啦。把那个搞 IT 的抓起来打屁股。

    2.在你的 WEB 目录下放一个极小的图片,我用 PS 做了个 1 像素的图片,才 49 字节!!!开启程序的时候同时加载 2 个地址的这个图片,谁先加载成功,就走哪个,这个不难吧?而且延迟也会很小!还搞什么 ajax,太麻烦了!直接搞 2 个 img,谁先 onload 就走谁。简单吧?

    PS:这个工作说起来不是你前端做,但是后端更是做不了的。。。。其实根本的原因就是它是网络设置错了才会这样
    nfroot
        3
    nfroot  
       Mar 8, 2019
    作为一个主职管 ERP 的,二三层交换懂一点,桌面运维懂一点,数据库懂一点,前端懂一点,后端也懂一点,工厂怎么运作的懂一点,财务也懂一点。。。

    也是个蛋疼
    zenxds
        4
    zenxds  
       Mar 8, 2019
    用 we'brtc 采集到当前的 IP,然后根据格式判断是内网还是外网
    maichael
        5
    maichael  
       Mar 8, 2019
    @zenxds #4 client 在内网又不表示和 server 在同一个内网。
    maichael
        6
    maichael  
       Mar 8, 2019
    你这种方法我觉得没有问题,你可以把判断内外网封装成一个方法,然后写成用 promise.all 之类的并且写成阻塞的方式,在页面刚进入的时候做这操作就好了,不影响扩展性。
    kisara
        7
    kisara  
       Mar 8, 2019
    很简单 在公网架设一个服务器 从本机获取一下 ip 在从服务器上查询一下本机 ip 看看一致不一致就行了
    Yourshell
        8
    Yourshell  
       Mar 8, 2019
    改下内网 DNS 不就好了么
    maichael
        9
    maichael  
       Mar 8, 2019   ❤️ 1
    @maichael #6 promise.race
    ASpiral
        10
    ASpiral  
    OP
       Mar 8, 2019
    @nfroot 就是分不清所以来发问啊…我找对方管理网络的人求助,他跟你一样说一堆我不了解的专业名词,最后怪我水平不行让我找其他前端解决…
    gamexg
        11
    gamexg  
       Mar 8, 2019 via Android
    两个都试试,哪个能用用哪个。
    另外内网无法用外网地址,应该是对方路由未设好。
    yhxx
        12
    yhxx  
       Mar 8, 2019
    改域名解析不能解决吗?
    580a388da131
        13
    580a388da131  
       Mar 8, 2019 via iPhone
    既然是放在 app 里面,要求 app 传递一下网络情况不就好了?
    cpdyj0
        14
    cpdyj0  
       Mar 8, 2019
    这叫啥需求,应当甩锅给网管……
    Jex
        15
    Jex  
       Mar 8, 2019
    nfroot
        16
    nfroot  
       Mar 8, 2019   ❤️ 1
    @ASpiral
    1.正常来说,既然公网 IP 映射了端口,那就必然能在所有联了互联网的机器访问,包括任何公司、家联网的设备。你说的对方内网访问不了,这是不合理的,除非是被内部限制了网络,不准上网的机器(这种就只能靠你去解决了,就比如你主题中的方法,再优化也差不多,就是这样了,别想了,再想也无用,后端也没办法解决,只有你解决)
    2.无限制的情况下,只能是路由 /策略路由指错了接口,否则根本就不存在访问不了的情况。这个就要对方管网络的去解决。但是你的主题里没有提到这部分。
    3.上面有一些错误的回复。或者说通过更复杂的技术,但反而很难准确判断,原因我前面的回复也说了。
    ThirdFlame
        17
    ThirdFlame  
       Mar 8, 2019
    显然是出口设备(简称路由器) ,对于内网设备访问路由器 wan 口映射地址时出错导致的。 此问题 已知华为部分防火墙就有,而且无法解决。
    总的来说 属于网络问题,非前端 /后端问题。
    ASpiral
        18
    ASpiral  
    OP
       Mar 8, 2019
    @maichael 我一开始直接在原来的代码里改,看起来好糟,怕影响后续业务扩展,看来得把这部分代码单独封装起来…
    ASpiral
        19
    ASpiral  
    OP
       Mar 8, 2019
    @yhxx 内网可以访问域名,但加了端口就不行,我跟后台都不懂,对方网管对我们爱理不理,感觉作为外包不是很受待见…
    ASpiral
        20
    ASpiral  
    OP
       Mar 8, 2019
    @ThirdFlame 前端显示不出数据,项目经理就认为是前端的问题,我对网络这块不了解没办法跟经理解释清楚,感觉做外包沟通好麻烦= =
    myzyq
        21
    myzyq  
       Mar 8, 2019 via iPhone
    感觉域名解析靠谱!
    Acoffice
        22
    Acoffice  
       Mar 8, 2019 via Android   ❤️ 1
    @ASpiral 你内外网访问地址不一致?比如外网访问是 112.x.x.x:8080 内网直接访问 192.168.1.2 ?
    -----
    正常来说,如果内外端口一致,内网有上网权限,是不会访问不了的.
    域名同理,如果内网有 DNS 服务器,且指定了域名对应的内网地址,那内网无上网权限也没有影响.
    autoxbc
        23
    autoxbc  
       Mar 9, 2019   ❤️ 1
    这个问题的术语叫 NAT 回流,对方好沟通的话让网管处理
    greatbody
        24
    greatbody  
       Mar 9, 2019
    @leo108 赞同。
    aunox
        25
    aunox  
       Mar 9, 2019
    前提:在内网时,不能访问外网。
    在第三方不给你提供帮助的情况下,#2 的解决方案里面第二种是比较靠谱的。只要判断内网图片能不能访问就行了,内网 IP 路由没几跳,这个错误响应速度是很快的,对于使用者来说应该是无感知的,公网下载图片就不要测试了。
    sampeng
        26
    sampeng  
       Mar 9, 2019 via iPhone
    这明显要甩锅给甲方的网络环境…关你们屁事昂。合同有写么
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   826 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 21:06 · PVG 05:06 · LAX 14:06 · JFK 17:06
    ♥ Do have faith in what you're doing.