前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的,因为一直没有很好的解决问题。

正文

当我们通过webstorm等IDE开发工具启动项目的时候,通过命令控制台可以观察到启动项目的命令
如下:

webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

我们很容易发现,用到了一个配置文件build/webpack.dev.conf.js
我因为实在逼得找不到原因,明明按照网上的文章配置的,但是跨域依旧没解决,总会遇到各种各样的问题。

不得已之下,看了下项目的启动配置文件。看完后,感觉自己搞懂了怎么回事,有感。

开始

首先我们要确认后端的跨域是允许的。

首先确保后端跨域没问题,目的是解决前端的问题

Springboot为例可以通过下面注解允许某个接口(注解方法上与@RequestMapping,@GetMapping等相关注解一起使用),或一批接口(注解在类上)

@CrossOrigin(originPatterns = "*", allowCredentials = "true", origins = "*")

如果是springsecurity 登录接口,简单代码片段列举,通过csrf().disable() 去允许接口可以跨域

protected void configure(HttpSecurity http) throws Exception {http.csrf().disable()

随着版本的迭代有些配置可能会变更,我们可以通过观看源码找到那些内容发生了变更,然后自己尝试去解决问题。

在网上你会看到各种各样的文章,有人说是改config/vue.config.js,也有人说是改config/index.js 去解决跨域问题。

以我这里为例子,会发现项目中没有vue.config.js与网上某些文章不一样。
在这里插入图片描述
通过观看build/webpack.dev.conf.js 源码
截取部分源码,会发现require('../config')引入了config/index.js
最主要的是我们看到了源码中有config.dev.host等相关的内容,
其中我们发现代理相关的词proxy: config.dev.proxyTable, 从这里我们就可以知道用的是proxyTable的配置来代理后端解决跨域问题。
如果你发现项目用的名称不叫 proxyTable 只需要找到对应位置去修改就行了

'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)const devWebpackConfig = merge(baseWebpackConfig, {module: {rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })},// cheap-module-eval-source-map is faster for developmentdevtool: config.dev.devtool,// these devServer options should be customized in /config/index.jsdevServer: {clientLogLevel: 'warning',historyApiFallback: {rewrites: [{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },],},hot: true,contentBase: false, // since we use CopyWebpackPlugin.compress: true,host: HOST || config.dev.host,port: PORT || config.dev.port,open: config.dev.autoOpenBrowser,overlay: config.dev.errorOverlay? { warnings: false, errors: true }: false,publicPath: config.dev.assetsPublicPath,proxy: config.dev.proxyTable,quiet: true, // necessary for FriendlyErrorsPluginwatchOptions: {poll: config.dev.poll,}},

我们确定了需要改的内容是config/index.js 中的 config.dev.proxyTable 字段配置

proxyTable: {'/api': {target: 'http://localhost:8081', // 你请求的第三方接口,后端地址changeOrigin: true,// 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题ws: true,pathRewrite: { // 路径重写,'^/api': ''// 替换target中的请求地址}}
}

UI 的端口是8080,后台的端口是8081
我们希望用axios去访问8081返回我们想要的数据。
上面的配置意思是,会将 url 以/api 开头通过axios发送的请求会被拦截和代理。
例如我想访问后端的登录接口http://localhost:8081/user/login 去登录返回 token 和user的信息

一般我们会这样做

axios.post('/user/login', this.loginForm, {headers: {'Content-Type': 'application/x-www-form-urlencoded'}})
.then(res => {// TODO
})

如果代理没生效,那么它发的请求就是http://localhost:8080/user/login 不是我们期望的8081端口。

实际上代理生效后,通过浏览器的Network也看不出来访问的是8081的还是8080端口的。
你只能在Network中看到,request header是8080端口。
因此很多人搞不清。
通过后端打断点,我确认了该请求是否访问到后端api。


上述给的例子中是否有发现proxyTable/api以及内部的pathRewrite配置,
但是我的axios请求中没有/api前缀,因此上述实际proxyTable并没有用,还需要给url带上/api前缀才可以代理生效

修改main.js加入下面片段,将前缀/api 通过总入口方式带入即可。(这样url就不要自己手动拼上/api

import axios from 'axios'
Vue.prototype.$axios = axios
axios.defaults.baseURL = '/api'
Vue.config.productionTip = false

最后重启vue项目检验一下。

Header信息如下,8080是前端的端口,Request URL: http://localhost:8080/api/user/login这里只是显示成前端的8080,实际上调用的是8081后端的api http://localhost:8081/user/login 后端的springboot接口是@PostMapping("/user/login")
我们可以明显看到后端有返回json数据过来。
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES(ECMAScript) vs JS常量进一步探讨 obj对象的扩展面试:使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值:数组解构赋值:对象解构赋值:…

阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案

TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作,基于 diffusion 方法来直接的从音频到视频合成数字人,避免了中间的三维模型或面部 landmark 的需求,效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…

Python枚举类详解:用enum模块高效管理常量数据

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 在编程中,常量的管理是一个关键环节,合理的管理常量可以提高代码的可读性和可维护性。Python的enum模块提供了一种有效的方式来组织常量数据,通过枚举类(Enum)将相关的常量值集合在一起,使代码更具结…

candence: 如何快速设置SUBCLASS 的颜色

如何快速设置SUBCLASS 的颜色 一、一般操作 正常情况下修改SUBCLASS,需要如下步骤进行设置: 二、快速操作 右键,选择一个颜色即可

多目标优化算法:多目标海星优化算法(MOSFOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、海星优化算法 海星优化算法(Starfish Optimization Algorithm ,SFOA)是2024年提出的一种元启发式算法,该算法模拟了海星的行为,包括探索、捕食和再生。 算法灵感: SFOA的灵感来源于海星的捕食行为&…

实时质检-静音检测分析流程(运维人员使用)

前言 用户在实时质检时,开启了主叫或被叫静音检测功能,但是听录音时,主叫或被叫明明没有任何声音,但是通话没有被挂断。 说明主叫或被叫的静音阈值太低,导致系统没有把很小的声音认定为静音;或者检测非静音…

Android Gradle 插件和 Android Studio 兼容性

Android Gradle 插件和 Android Studio 兼容性 Android Studio 版本所需的 AGP 版本Ladybug 2024.2.13.2-8.7Ladybug 2024.2.13.2-8.7Koala 2024.1.12024.2.1Jellyfish 2023.3.12024.2.1Iguana 2023.2.13.2-8.3Hedgehog 2023.1.13.2-8.2Giraffe 2022.3.13.2-8.1Flamingo 2022.…

python中如何计算布尔值

布尔值是 Python 中的基本数据类型,只有两个值: True 表示“真”。注意首字母都是大写False 表示“假”。 那么问题来了,什么样的值是True,什么样的值是False呢? 值为True的情况有无数种,但是为False的就…

阿里云cdn配置记录和nodejs手动安装

cdn 登录阿里云 域名解析权限 开启cdn,接引导流程, 源可以设置 域名或者ip等 配置好域名解析 上传https证书 图片不显示,后端开发需要配置 回源配置的回源协议 ,配置跟随客服端【如果浏览器多次重定向错误,客服或者改…

了解Redis(第一篇)

目录 Redis基础 什么事Redis Redis为什么这么快 除了 Redis,你还知道其他分布式缓存方案吗? 说-下 Redis 和 Memcached 的区别和共同点 为什么要用Redis? 什么是 Redis Module?有什么用? Redis基础 什么事Redis Redis (REmote DIctionary S…

D77【 python 接口自动化学习】- python基础之HTTP

day77 postman接口请求 学习日期:20241123 学习目标:http 定义及实战﹣﹣postman接口请求 学习笔记: get请求 post请求 总结 get请求用于查询数据post请求用于添加数据

Element-Ui组件(icon组件)

一、前言 本篇文章主要是对官网的Icon组件进行总结归纳Icon 图标 | Element Plus 在现代Web应用开发中,图标是用户界面设计中不可或缺的一部分。它们不仅提升了用户体验,还使得信息的传达更加直观和高效。本文主要对Element Plus 官方提供的Icon组件进行…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字,我们会发现其中包含Spring,那么SpringMVC和Spring之间有怎样的关系呢? SpringMVC隶属于Spring,是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢? 回想web阶段&#x…

flink1.16+连接Elasticsearch7官方例子报错解决方案

flink输出至es&#xff0c;连接es7时使用的sink类是Elasticsearch7SinkBuilder&#xff0c;与es6链接方式不同&#xff0c;官网地址&#xff1a;fink连接es官方地址。 flink连接es7官方示例 依赖jar&#xff1a; <dependency><groupId>org.apache.flink</gro…

力扣--LRC 142.训练计划IV

题目 给定两个以 有序链表 形式记录的训练计划 l1、l2&#xff0c;分别记录了两套核心肌群训练项目编号&#xff0c;请合并这两个训练计划&#xff0c;按训练项目编号 升序 记录于链表并返回。 注意&#xff1a;新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&am…

应急响应靶机——linux2

载入虚拟机&#xff0c;打开虚拟机&#xff1a; 居然是没有图形化界面的那种linux&#xff0c;账户密码&#xff1a;root/Inch957821.&#xff08;注意是大写的i还有英文字符的.&#xff09; 查看虚拟机IP&#xff0c;192.168.230.10是NAT模式下自动分配的 看起来不是特别舒服&…

《Python 股票交易分析:开启智能投资新时代》(二)

Python 进行股票交易分析的优势 简洁易读&#xff1a;Python 的语法简洁明了&#xff0c;即使是编程新手也能较快上手&#xff0c;降低了股票交易分析的门槛。 Python 的简洁易读是其在股票交易分析中受欢迎的重要原因之一。Python 的语法简洁明了&#xff0c;与其他编程语言相…

ECharts柱状图-带圆角的堆积柱状图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

算力100问☞第16问:什么是TPU?

TPU全称是Tensor Processing Unit芯片&#xff0c;中文全称是张量处理单元芯片&#xff0c;是谷歌开发的一种特殊类型的芯片&#xff0c;用于加速人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;工作负载。TPU主要针对张量&#xff08;tensor&#xf…

【刷题21】BFS解决FloodFill算法专题

目录 一、图像渲染二、岛屿数量三、岛屿的最大面积四、被环绕的区域 一、图像渲染 题目&#xff1a; 思路&#xff1a; 如果起始位置的颜色(数值)与color相同&#xff0c;直接返回该数组上下左右一层一层的找与当前位置颜色相同的&#xff0c;并且该位置不越界&#xff0c;然…