前端获取ip地址判断国家请求不同baseUrl

article/2025/10/21 4:52:08

项目背景

项目新需求:根据ip地址区分出国内外上网,axios 使用不同的baseurl,上传阿里oss不同bucket

获取ip地址

一、使用js自己获取

使用 RTCPeerConnection.setLocalDescription()

WebRTC API

pc端没问题,移动端不好使

   //获取用户本地ip的方法export function getIPs(callback){var ip_dups = {};var RTCPeerConnection = window.RTCPeerConnection|| window.mozRTCPeerConnection|| window.webkitRTCPeerConnection;var useWebKit = !!window.webkitRTCPeerConnection;var mediaConstraints = {optional: [{ RtpDataChannels: true }]};// 这里就是需要的ICEServer了var servers = {iceServers: [{ urls: "stun:stun.services.mozilla.com" },{ urls: "stun:stun.l.google.com:19302" },], };var pc = new RTCPeerConnection(servers, mediaConstraints);function handleCandidate(candidate) {var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/var hasIp = ip_regex.exec(candidate)if (hasIp) {var ip_addr = ip_regex.exec(candidate)[1];if (ip_dups[ip_addr] === undefined)callback(ip_addr);ip_dups[ip_addr] = true;}}// 网络协商的过程pc.onicecandidate = function (ice) {if (ice.candidate) {handleCandidate(ice.candidate.candidate);}};pc.createDataChannel("");//创建一个SDP(session description protocol)会话描述协议 是一个纯文本信息 包含了媒体和网络协商的信息// pc.createOffer().then((offer) => pc.setLocalDescription(offer));pc.createOffer().then((offer) => pc.setLocalDescription(new RTCSessionDescription(offer)));// pc.createOffer(function (result) {//   pc.setLocalDescription(result, function () { }, function () { });// }, function () { });setTimeout(function () {if(pc.localDescription){var lines = pc.localDescription.sdp.split('\n');lines.forEach(function (line) {if (line.indexOf('a=candidate:') === 0)handleCandidate(line);});}else{console.log('未获取到ip信息')// 未获取到信息就写死,360浏览器pc.localDescription=nullcallback('125.211.30.71');}}, 1000);}
// 使用方法
getIPs(async (ip) => {console.log('获取到的ip', ip)
})

二、使用现成api调用

第一种方法不兼容移动端,所以只能使用三方api

 axios.get('https://ipv4.icanhazip.com/').then(async res=>{let ip = res.dataconsole.log('ipv4', ip)
}

更多的三方ip获取请参考这篇文章

axios 设置:异步获取数据后导出

本想根据三方接口请求获取ip后,再请求接口获取国家(后端写好的接口),以此设置baseUrl后导出,供axios使用;
想的很美/(ㄒoㄒ)/~~,然而导出的常量或对象并不支持异步
举个例子(以下代码是错误示范) :

// config.js
let config = {development:{baseurl:''},release:{baseurl:''}
}
function handleReq(){axios.post('/getCountry').then(res=>{if(res.code==0){config[import.meta.env.MODE].baseurl = res.country == 'cn' ? 'http://cn-api.com':'http://us-api.com'console.log('config', config[import.meta.env.MODE].baseurl) // *// import.meta.env.MODE 是vite获取环境变量的写法}})
}
handleReq()
export const baseurl = config[import.meta.env.MODE].baseurl
// axios.js中使用
import { baseurl } from '@/config'
axios.defaults.baseURL = baseurl 
console.log('baseurl:', baseurl)  // *

在这里插入图片描述

所以只能改变策略,把异步请求回来的状态存储在localStorage里,然后在使用的地方,获取localStorage里的状态,从而进行判断

// config.js
export const baseurl_cn = 'http://cn-api.com'
export const baseurl_us = 'http://us-api.com'function handleReq(){axios.post('/getCountry').then(res=>{if(res.code==0){localstorage.setItem('country', res.country)}})
}
handleReq()
// axios.js
import { baseurl_cn, baseurl_us } from '@/config'
let country = localStorage.getItem('country')
axios.defaults.baseURL = country == 'cn' ? baseurl_cn : baseurl_us 

http://chatgpt.dhexx.cn/article/LmrD8tu3.shtml

相关文章

electron-vue通过配置文件设置baseUrl

在项目更目录下创建config.conf {"baseURL": "http://***.cn:8001" }在package.json中配置build "build": {..."appId": "com.yuma.duifu","extraResources": {"from": "./config.conf",&q…

linux yum baseurl,解决CentOS系统Yum出现”Cannot find a valid baseurl for repo”问题 | 老左笔记...

有网友告知老左自己在腾讯云服务器上部署环境使用到yum命令的时候提示无法执行脚本有出现"Cannot find a valid baseurl for repo"问题提示。看到这样的问题肯定是源不通导致的,先搜索搜索是否有同样的解决方法,有的人用到需要更新repo的&…

axios 动态设置baseUrl

有这样的一个需求,通过界面进行修改axios 里的baseUrl,想到的是先缓存,然后在拦截器里去修改! 直接这样覆盖config.baseUrl发现起不了作用,最后改成config.url sysUrl config.url就可以了

axios关于baseURL问题

提交表单后可以看到前端拿到了username,报错信息如下,后端没有接收到错误,并且用postman测试发现没有问题。 在axios的request.js中baseUR本来设置为 设置为baseURL: http://localhost:8081解决了这个问题 设置完之后post的请求地址reques…

Android切换BaseUrl项目

效果图 大概效果就是把域名从Github切换到简书,提供了一个悬浮小球,可选择配置好的TestUrl与ProductUrl,也可手动输入这个BaseUrl; 项目起因 1、测试经常频繁需要切换测试环境和生产环境又不想用2个测试机测试 2、后台若要打断点测试&a…

React配置baseUrl

在react脚手架中下载axios 命令为npm i axios 进入脚手架中,打开src下的index.js入口,引入axios import axios from axios 设置axios默认请求地址 例如我暂时写的项目 axios.defaults.baseURL http://127.0.0.1:8080 在需要的地方直接发起请求

baseURL 多重跨域 ( 含 jeecg-boot 项目 )

文章目录 jeecg-boot 项目前言config\index.jsrequest.js地址 通用项目解决办法1、修改 env 配置,以 开发环境为例(这一步针对 jeecg-boot 项目)2、vue.config.js 添加跨域注意: 普通项目多重跨域请直接看 vue.config.js 添加跨域…

HSF源码剖析

前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remote Procedure…

Java-RPC通信--HSF框架

最近leader给了KingYiFan一个任务,就是对接某国企的业务,人家用的淘宝的HSF框架RPC通信 根本不用httpclient what??? RPC不是Dubbo底层协议吗?这怎么通讯呢?翻遍了整个百度没有我想要的。 有一个…

hsf服务的调用过程

目录: 写一个hsf服务并发布 写一个接口工程 写一个实现接口的实现工程 写一个发布接口工程和实现工程的服务工程 写一个应用实现借口 hsf服务调用的过程 通过JBoss/Tomcat启动服务 通过main口启动服务 过程: 写一个hsf服务并发布: 在上…

HSF 开发

HSF 简介 HSF(High Speed Service Framework),高速服务框架,是阿里-主要采用的服务框架,其目的是 作为桥梁联通不同的业务系统,解耦系统之间的实现依赖。 1: RPC 远程过程调用(Remote Procedure Call)是一种通过网络从远程计算机程…

分布式服务框架 HSF

摘要: RPC 协议采用多路复用的 TCP 长连接方式,在服务提供者和调用者间有多个服务请求同时调用时会共用同一个长连接,即一个连接交替传输不同请求的字节块。它既避免了反复建立连接开销,也避免了连接的等待闲置从而减少了系统连接…

HSF (RPC远程调用框架)

HSF 1. HSF概述1.1 概述1.2 HSF架构1.3 功能1.4 应用开发方式 2. 使用 Ali-Tomcat 开发2.1 Ali-Tomcat概述2.2 安装及开发环境配置2.2.1 安装Ali-Tomcat和Pandora2.2.2 配置IntelliJ IDEA开发环境 2.3 开发HSF应用2.3.1 定义服务接口2.3.2 开发服务提供者2.3.3 开发服务消费者2…

分布式服务框架HSF简介

高速服务框架 HSF (High-speed Service Framework),是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 统一了分布式应用中服务的发布/调用方式,从而帮助您方便、快速的开发分布式应用 HSF 架构 HSF 作为一个纯客户端架构的 RPC 框架,本…

分布式服务框架HSF

HSF提供的是分布式服务开发框架,taobao内部使用较多,总体来说其提供的功能及一些实现基础: 1.标准Service方式的RPC 1)、Service定义:基于OSGI的Service定义方式 2)、TCP/IP通信: IO方式…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework),高速服务框架,是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件,联通不同的业务系统,解耦系统间的…

关于 HSF框架 (一)简单介绍

HSF介绍 HSF全称 high speed frameworkd, 是Alibaba内部使用的RPC框架,最初与Dubbo进行内部竞争,由于多方面的原因最终选择了HSF。 主要原因如下: HSF代码量少一些,轻量一些,代码量大概2/3, Dubbo设计更加全面功能更多…

hsaf框架

一.技术分层 a).前端展现层,泛指一切在客户端直接与用户打交道的客户界面(),MVC架构中的view层 b).控制层:分为过滤器拦截器层,Controller控制器层 c).业务逻辑层&…

高速服务框架HSF

一、简述 HSF(High-speed Service Framework),是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。 HSF 连通不同的业务系统,解耦系统间的实现依赖。HSF 从分布式应用的层面,统一了服务的发布与调用方式,从而帮助用户更加方便、快…

阿里HSF(服务框架)

文章目录 HSF(服务框架)简介架构设计Provider——服务提供者Consumer——服务消费者ConfigServer——配置服务器Diamond——持久化配置中心addressServer——地址服务元数据存储 HSF(服务框架) 文章地址 简介 高速服务框架 HS…