前后端分离,解决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.rhkb.cn/news/478570.html

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

相关文章

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…

Hyper-V配置-cnblog

启用Hyper-V以在 Windows 10上创建虚拟机 (1)控制面板检查系统要求: 确保您的计算机符合 Hyper-V 的系统要求。通常情况下,您的计算机需要运行 Windows 10 专业版、企业版或教育版,并且具有启用了虚拟化技术的处理器。…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按: 面对 Llama 模型家族的持续更新,您是否想要了解它们之间的关键区别和实际性能表现?本文将探讨 Llama 系列模型的架构演变,梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程,深入剖析了每个版本的技术创新&#…

GitLab 备份与恢复

在 GitLab 中,备份和恢复是运维中非常关键的部分,尤其是数据的安全与一致性。以下是具体操作指南。 GitLab 备份 GitLab 提供了内置的备份工具,通过 gitlab-backup 命令生成备份文件。 1. 备份环境准备 确保以下几点: 备份存储路径…

填补覆盖空白,小型机器人让智能清洁再“净”一步!

尽管不同商用场景的大多区域都十分相似,但非标准化的场景属性无法避免的导致了不少corner case。面对狭窄场景,“强悍”的商用清洁机器人迎来了自己的“职业危机”。 随着城市化进程的推进和服务业比重提升,商场、写字楼等细分场景不断扩容&a…

非root用户安装CUDA

1.使用nvidia-smi查看当前驱动支持的最高CUDA版本: 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面,https://developer.nvidia.com/cuda-toolkit-archive,选择想要安装的版本,例如想要安装CUDA11.4: 如果需要查看ub…

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入

1.使用命令新建三个.c文件vi main.c,vi input.c,vi caclcu.c,两个.h文件vi input.h,vi caclcu.h 2.vi Makefile:新建Makefile文件,输入一下内容 注意:命令列表中每条命令前用TAB键,不…

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗,温度升高芯片失效率也会增加,增加散热片或风扇会增加整体重量和成本,在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支,产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…

菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云联营联运合作伙伴

日前,菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云在实时音视频领域的联营联运合作伙伴。 菊风结合自身产品方案优势与华为云开放、共盈的生态优势强强联手,在推动金融行业数字化转型的路上又向前迈出了一大步。华为云云商店作为…

vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发

sunsetglow/vue-pdf-viewer 开箱即用的pdf插件sunsetglow/vue-pdf-viewer, vue3 版本 无需多余开发,操作简单,支持大文件 pdf 滚动加载,缩放,左侧导航,下载,页码,打印,文本复制&…

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据,批量的导入与之匹配的图片。 准备工作 如图,我们准备了一张员工信息表以及几张员工的照片 可以看到,照片名称是每个人的名字,与Excel表中的B列(姓名)对应 的卢易…

如何在 Eclipse 中调试ABAP程序

原文链接:Debugging an ABAP Program ADT 中的调试器是一个重要的诊断工具,可用于分析 ABAP 应用程序。 使用调试器,您可以通过在运行时 Debug 单步执行(F5)程序来确定程序无法正常工作的原因。这使您可以看到正在执…

101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)

一、前言 这份报告是一份关于集团信息化顶层规划设计的总体解决方案,旨在通过信息化转型提升集团管控和企业运营效率。报告回顾了项目的背景、目标和工作过程,分析了集团面临的内部和外部挑战,并提出了一系列解决方案,包括自上而…

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来,实现: 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司(以下简称“中远大昌”)成立于2002年,是中远海运集团所属香远(北…

ubuntu中使用ffmpeg和nginx推流rtmp视频

最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …

KMeans聚类实验(基础入门)

KMeans实验通常涉及使用KMeans聚类算法对数据集进行聚类分析。以下是一个关于KMeans实验的详细指导: 一、实验目的 加深对非监督学习的理解和认识。掌握动态聚类方法KMeans算法的设计方法。 二、实验环境 具有相关编程软件的PC机,通常使用Python、R等…

函数类型注释和Union联合类型注释

函数类型注释格式(调用时提示输入参数的类型): )def 函数名(形参名:类型,形参名:类型)->函数返回值类型: 函数体 Union联合类型注释(可注释多种类型混合的变量)格式: #先导入模块 from typing import…

重新定义社媒引流:AI社媒引流王如何为品牌赋能?

在社交媒体高度竞争的时代,引流已经不再是单纯追求流量的数字游戏,而是要找到“对的用户”,并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略,重新定义了社媒引流的方式,帮助品牌在精准触达和高效互动中脱…

基于Boost库的搜索引擎

本专栏内容为:项目专栏 💓博主csdn个人主页:小小unicorn ⏩专栏分类:基于Boots的搜索引擎 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识…

了解M有SQL索引

目录 索引介绍 索引的优缺点 索引底层数据结构选型 Hash表 二叉查找树(BST) AVL树 红黑树 B 树& B树 索引类型总结 主键索引(Primary Key) 二级索引 聚簇索引与非聚簇索引 聚簇索引(聚集索引) 聚簇索引介绍 聚簇索引的优缺点 非聚簇索引(非聚集索引) 非聚簇…