前端项目根据环境设置请求地址和接口代理,以及解决多个localhost服务token被覆盖

简介: 一般开发项目除了正式的生产环境,还会有对应的开发环境、测试环境和预发布环境,每个环境所访问的接口地址肯定不一样,如果自己一个个手动修改那就太不程序猿了

配置项目接口请求地址

一般开发项目除了正式的生产环境,还会有对应的开发环境、测试环境和预发布环境,每个环境所访问的接口地址肯定不一样,如果自己一个个手动修改那就太不程序猿了。

有人可能首先想到根据命令行参数 process.env.NODE_ENV 环境变量来设置,但是一般前端本地开发和部署到开发环境上连接的都是开发环境,用环境变量并不能区分开来,但是直接用域名前缀就能很好区分开来,本地一般都运行在 localhost 或 192 开头的局域网 ip 地址上。

// 项目 config 请求地址配置模板

export const isProd = process.env.NODE_ENV === 'production'
export let env = 'pro'
export let apiUrl = '/api/'

// 根据域名设置接口地址
switch (location.hostname.split('.')[0]) {
   
  case '192': // 局域网 (本地开发跨域可以配置代理)
  case 'localhost':
    env = 'dev'
    apiUrl = '/api-dev'
    break
  case 'dev':
    env = 'dev'
    apiUrl = 'http://dev.EXAMPLE_URL/api/'
    break
  case 'test': // 测试环境
    env = 'test'
    apiUrl = 'http://test.EXAMPLE_URL/api/'
    break
  case 'pre': // 预发布
    env = 'pre'
    apiUrl = 'http://pre.EXAMPLE_URL/api/'
    break
}

配置本地接口代理

之所以要区分开是不是本地开发,当后端接口不能跨域访问的时候,我们就可以用到 webpack 提供的代理设置,利用本地起一个代理服务器来解决跨域问题

// vue.config.js 配置代理

module.exports = {
   
  // ...

  // 设置代理解决跨域问题
  devServer: {
   
    headers: {
   
      'Access-Control-Allow-Origin': '*',
    },
    proxy: {
   
      '/api-dev': {
   
        target: 'http://dev.EXAMPLE_URL/api/',
        changeOrigin: true,
        pathRewrite: {
    '^/api-dev': '' },
      },
    },
  },
}

注意:proxy 工作原理实质上是利用 node 的 http-proxy-middleware 这个http代理中间件,实现请求转发给其他服务器,特别需要注意的是这个只能用作于开发阶段,临时解决本地请求服务器产生的跨域问题,并不适用于线上环境哟!

除了解决跨域,当后端接口还没有全部开发完,或者来不及部署到开发环境上时,我们也可以通过代理配置来直接用 ip 地址访问后端的电脑本地起的服务器,实现接口联调,很长一段时间我是拒绝后端这样的要求的,强硬地要让他们部署到开发环境上去,因为我特么不会设置代理去访问呀,嘿嘿...

当后端在本地起了一个服务器让你访问时,会给你个ip地址,前端拿到 ip 再去 vue.config.js 里的 proxy 设置对应的拦截接口和代理地址就行了

// vue 文件
<script>
  export default {
   
    data() {
   
      return {
   

      }
    },
    methods: {
   
      async getData() {
   
        let params = {
    userId: '1345102704' }
        const res = this.$axios.get('sys-user/get-user-info', params)
        // ...
      }
    }
  }
</script>

// vue.config.js
module.exports = {
   
  // ...
  devServer: {
   
    headers: {
   
      'Access-Control-Allow-Origin': '*',
    },
    proxy: {
   
      '/api-dev/sys-user/get-user-info': {
   
        // 注意:
        // ① 要放在下面 /api-dev 那个统一的代理拦截前面,否则就走到下面那个代理里去了
        // ② 一般接口请求路径里的 /api 和 /sys-user 服务名这些都是在后端框架或Nginx里统一设置的
        // 当后端自己起的本地服务器一般也就设置了一个端口,所以是不需要这些的(当然,最终以后端发给你的完整路径为准)
        target: 'http://192.168.1.110:8080/',
        changeOrigin: true,
        pathRewrite: {
    '^/api-dev': '' },
        // 路径重写后的实际访问地址 http://192.168.1.111:8080/get-user-info
      },
      '/api-dev': {
   
        target: 'http://dev.EXAMPLE_URL/api/',
        changeOrigin: true,
        pathRewrite: {
    '^/api-dev': '' },
      },
    },
  },
}

本地开发 localhost 多个服务token被覆盖

同时开发多个前端项目,都是运行在 localhost 下的不同端口上:localhost:8080、localhost:8081、localhost:8082...一去登录其中一个端,其他端的登录态都失效了。

项目里的登录态 token 都是存在 cookie 里的,代码如下:

import axios from 'axios'

// 添加请求拦截器
axios.interceptors.request.use(config => {
   
  // 请求头添加登录验证
  config.headers.Token = cookie('token') || 'null' // 防止不传,被网关拦截,接口401
  return config
}, error => {
   
  return Promise.reject(error)
})

cookie 是不提供端口隔离的,不同的端口下的服务 cookie 是可以相互读写的,所以登录其中一个端时,其他端口下的所有服务的 token 都会被新的替换了

解决方案

  1. 开不同的浏览器(chrome、firefox、edge),注意相同浏览器开不同的窗口也是不行的,要用不同的浏览器
  2. 一般本地运行的项目会有两个地址,像下面这样,如果两个项目可以一个用localhost(127.0.0.1),一个用下面的Network那个ip地址
  App running at:
  - Local:   http://localhost:8080/
  - Network: http://192.168.2.123:8080/

浏览器缓存作用域

  • localStorage:协议、主机名以及端口
  • sessionStorage:协议、主机名以及端口,还要加上浏览器标签页
  • cookie:范围仅限于当前主机名上的所有URL - 而不是绑定到端口或协议信息,domain本身以及domain下的所有子域名,需注意cookie不提供端口隔离,即同一服务器的下运行的不同端口之间的服务是可以相互读写cookie的

注意

相同浏览器下,并且是同源窗口(协议、域名、端口一致),即使不同页面也是可以共享localStorage和Cookies值,但是不能共享sessionStorage

网络补充

同一个局域网里大家通过 ip 是可以实现相互访问的,这也是为什么后端在他本地起了一个服务,前端可以通过 ip 去访问,同样的地址你在家里的时候再去访问肯定就是打不开的,因为不在同一个局域网。

平时开发前端项目,不管是要在手机上查看实际效果,还是要分享给他人查看,我们也是可以直接通过 Network 那个 ip 地址分享给同事的(一般我们在vscode里打包运行起来后,复制到浏览器里打开的那个是 localhost)。

windows 上查看本机ip命令:ipconfig,mac和linux上终端命令是:ifconfig(总共有3个:"以太网适配器 以太网:"、"以太网适配器 vEthernet (Default Switch):" 和 "无线局域网适配器 WLAN,在手机上看用无线局域网那个 IPv4 地址)

相关文章
|
缓存 前端开发 JavaScript
前端开发的必修课:如何让你的网页在弱网环境下依然流畅运行?
【10月更文挑战第30天】随着移动互联网的普及,弱网环境下的网页性能优化变得尤为重要。本文详细介绍了如何通过了解网络状况、优化资源加载、减少HTTP请求、调整弱网参数和代码优化等方法,提升网页在弱网环境下的加载速度和流畅性,从而改善用户体验。
677 4
|
8月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
765 12
|
12月前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
11280 29
|
10月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
701 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
9月前
|
JSON 人工智能 前端开发
前端开发中使用whistle代理工具
Whistle是一款强大的代理工具,相比Charles、Fiddler更轻量且功能丰富。它适用于前端开发中的多种场景,如接口数据Mock、接口代理、静态资源代理等。通过简单的规则配置,可将接口指向本地JSON文件,解决跨域问题,或代理静态资源以满足特定域名访问需求。此外,Whistle还支持本地端口间转发与移动端请求抓包,搭配SwitchyOmega插件使用效果更佳。需注意,使用前请确保已安装Node环境并参考官方文档完成基础配置。
|
10月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
507 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
11月前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
898 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
11月前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
537 26
|
11月前
|
前端开发 JavaScript Java
前端解决axios请求的跨域问题【2步完成】
本文介绍如何通过前端配置解决跨域问题,主要针对Vue项目中的`vite.config.js`文件进行修改。作者在联调过程中遇到跨域报错
564 1
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1691 1

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    前端工程化演进之路:从手工作坊到AI驱动的智能化开发
  • 3
    Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式