前后端分离,解决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 development
  devtool: config.dev.devtool,

  // these devServer options should be customized in /config/index.js
  devServer: {
    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 FriendlyErrorsPlugin
    watchOptions: {
      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数据过来。
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)

适用于windows环境下通过docker desktop实现opengauss部署,请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项:后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…

Java开发经验——Spring Test 常见错误

摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…

基于 RBF 神经网络整定的 PID 控制

基于 RBF 神经网络整定的 PID 控制 是结合了传统 PID 控制和 RBF(径向基函数)神经网络的自适应控制方法。在这种方法中,RBF 神经网络用于自适应地调整 PID 控制器的增益(比例增益 KpK_pKp​,积分增益 KiK_iKi​ 和微分…

空间注意力网络的性能优化与多维评估

在本文中,首先分析空间注意力网络(Spatial Attention Neural Network)在五个不同数据集上的训练结果。这些数据集包括Daily_and_Sports_Activities、WISDM、UCI-HAR、PAMAP2和OPPORTUNITY。通过对比这些结果,我们可以深入理解空间…

Linux——1_系统的延迟任务及定时任务

系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…

【数据结构】—— 线索二叉树

引入 我们现在提倡节约型杜会, 一切都应该节约为本。对待我们的程序当然也不例外,能不浪费的时间或空间,都应该考虑节省。我们再观察团下图的二叉树(链式存储结构),会发现指针域并不是都充分的利用了,有许…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…

虚幻引擎---初识篇

一、学习途径 虚幻引擎官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-5-5-documentation虚幻引擎在线学习平台:https://dev.epicgames.com/community/unreal-engine/learning哔哩哔哩:https://www.b…

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环(Hardware-in-the-Loop,简称HiL)仿真测试,是模型基于设计(Model-Based Design,简称MBD)验证流程中的一个关键环节。该步骤至关重要,因为它整合了实际…

C++编程库与框架实战——sqlite3数据库

一,SQLite数据库简介 SQLite是可以实现类似于关系型数据库中各种操作的事务性SQL数据库引擎。 SQLite可以为应用程序提供存储于本地的嵌入式数据库,帮助应用程序实现轻量级的数据存储。 SQLite是一个库文件,并不是单独的进程,它可以静态或动态链接到C++应用程序中,然后…

STM32F10x 定时器

使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…

PyQt6+pyqtgraph折线图绘制显示

1、实现效果 2、环境: 确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装: pip install pyqtgraph 3、代码实现: 绘制折线函数: import sys import random from PySide6.QtWidgets import QAppl…

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名,运行此进程的用户名。PID: 进程ID(Process ID),每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…

高新技术行业中的知识管理:关键性、挑战、策略及工具应用

知识管理的关键性 在瞬息万变的信息时代,知识已成为高新技术行业的核心竞争要素。知识管理,这一旨在高效组织、整合并应用企业内外部知识资源的管理策略,对于推动高新技术企业的持续创新与发展至关重要。它不仅能够激发研发团队的创造力&…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea,找到连接中 文件,卸载即可。

【MyBatis】全局配置文件—mybatis.xml 创建xml模板

文章目录 模板文件配置元素typeAliasessettings 模板文件 创建模板 按照顺序打开【File】–>【settings】–>【Editor】–>【File and Code Templates】&#xff08;或直接搜索&#xff09; <?xml version"1.0" encoding"UTF-8" ?> <…

uni-app 发布媒介功能(自由选择媒介类型的内容) 设计

1.首先明确需求 我想做一个可以选择媒介的内容&#xff0c;来进行发布媒介的功能 &#xff08;媒介包含&#xff1a;图片、文本、视频&#xff09; 2.原型设计 发布-编辑界面 通过点击下方的加号&#xff0c;可以自由选择添加的媒介类型 但是因为预览中无法看到视频的效果&…

【Go】-go中的锁机制

目录 一、锁的基础知识 1. 互斥量/互斥锁 2. CAS&#xff08;compare and swap&#xff09; 3. 自旋锁 4. 读写锁 5. 乐观锁 & 悲观锁 6. 死锁 二、go中锁机制 1. Mutex-互斥锁 2. RWMutex-读写锁 2.1 RWMutex流程概览 2.2 写锁饥饿问题 2.3. golang的读写锁源…

Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例

一、首先要下载谷歌驱动 1.&#xff08;打开谷歌浏览器 - 设置 - 关于谷歌&#xff0c;查看谷歌浏览器版本&#xff0c;否则不对应无法调用&#xff0c;会提示&#xff1a;selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio…