Vue中如何解决跨域问题

news2024/11/15 12:44:07

跨域

跨域报错是前端开发中非常经典的一个错误,报错如下

 

 Access to XMLHttpRequest at '......' from origin 

 '......' has been blocked by CORS policy: 

 No 'Access-Control-Allow-Origin' header is present on the requested resource.

跨域错误源自于浏览器的同源策略,想要解决跨域首先要知道什么是同源策略

 

同源策略

同源策略:著名的安全策略,URL有三个基本组成部分:协议+域名或ip+端口,三个必须完全相同称之为同源,不同源的称之为跨域

 

URL URL 对比

http://localhost:3000/ https://localhost:3000/ 不同源:协议不同

http://localhost:3000/ http://127.0.0.1:3000/ 不同源:域名或ip不同

http://localhost:3000/ http://localhost:3001/ 不同源:端口不同

http://localhost:3000/ http://localhost:3000/ 同源

http://127.0.0.1:3000/ http://127.0.0.1:3000/ 同源

注意:同源策略不是服务器行为,而是浏览器的行为,服务器会正常响应请求,但是如果不同源会被浏览器拦截

 

express服务器

搭建一个express服务器用来演示跨域报错

 

安装express

 

 npm i express

app.js

 

 let express = require('express')

 let app = express()

 ​

 app.listen(3000, () => {

     console.log('服务器已启动...')

 })

 ​

 app.use(express.static('./views'))

 ​

 app.get('/getTest', (req, res) => {

     console.log(req.query)

     res.send(req.query)

 })

views/index.html

 

 <!DOCTYPE html>

 <html>

 ​

 <head>

     <meta charset="UTF-8">

     <title>Document</title>

     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

     <script>

         function getIpTest() {

             axios({

                 method: "get",

                 url: "http://127.0.0.1:3000/getTest",

                 params: { uid: 123 },

             }).then((res) => {

                 console.log(res.data);

             });

         }

         function getDnameTest() {

             axios({

                 method: "get",

                 url: "http://localhost:3000/getTest",

                 params: { uid: 123 },

             }).then((res) => {

                 console.log(res.data);

             });

         }

     </script>

 </head>

 ​

 <body>

     <button οnclick="getIpTest()">getIpTest</button>

     <button οnclick="getDnameTest()">getDnameTest</button>

 </body>

 ​

 </html>

打开浏览器访问http://127.0.0.1:3000/

 

调用getIpTest发送请求不会报错,因为浏览器地址栏访问的服务器是http://127.0.0.1:3000/** ,而方法内发送请求的URL也是http://127.0.0.1:3000/** ,视为同源

 

调用getDnameTest发送请求报错,因为浏览器地址栏访问的服务器是http://127.0.0.1:3000/** ,而方法内发送请求的URL也是http://localhost:3000/** ,视为跨域

6d65a61429a74ae5bbbf00db1690749b.png

 

 

 Access to XMLHttpRequest at 'http://localhost:3000/......' from origin 

 'http://127.0.0.1:3000' has been blocked by CORS policy: 

 No 'Access-Control-Allow-Origin' header is present on the requested resource.

打开浏览器访问http://localhost:3000/

 

调用getDnameTest发送请求不会报错,因为浏览器地址栏访问的服务器是http://localhost:3000/ ,而方法内发送请求的URL也是http://localhost:3000/ ,视为同源

 

调用getIpTest发送请求报错,因为浏览器地址栏访问的服务器是http://localhost:3000/ ,而方法内发送请求的URL也是**http://127.0.0.1:3000/** ,视为跨域

4a89278b647d4132a471101a18f8350b.png

 

 

 Access to XMLHttpRequest at 'http://127.0.0.1:3000/......' from origin 

 'http://localhost:3000' has been blocked by CORS policy: 

 No 'Access-Control-Allow-Origin' header is present on the requested resource.

vue处理跨域

创建vue项目,安装axios模块

 

 vue create app

 npm install axios vue-axios

main.js

 

 import axios from 'axios'

 import VueAxios from 'vue-axios'

 Vue.use(VueAxios, axios)

views/About.vue

 

 <template>

   <div class="about">

     <button @click="getTest()">getTest</button>

   </div>

 </template>

 ​

 <script>

 export default {

   methods: {

     getTest() {

       this.axios({

         method: "get",

         url: "http://127.0.0.1:3000/getTest",

         params: { uid: 123 },

       }).then((res) => {

         console.log(res.data);

       });

     },

   },

 };

 </script>

脚手架项目端口是8080而请求的express服务器端口是3000,不满足同源策略,发送请求报跨域错误

811a362f883346ccb87fbe857714600b.png

 

 

 Access to XMLHttpRequest at 'http://127.0.0.1:3000/......' from origin 

 'http://127.0.0.1:8080' has been blocked by CORS policy: 

 No 'Access-Control-Allow-Origin' header is present on the requested resource.

解决办法: 配置代理服务器

 

vue.config.js:修改后需要重启脚手架项目

 

 const { defineConfig } = require('@vue/cli-service')

 module.exports = defineConfig({

   transpileDependencies: true,

   devServer: {

     //配置http-proxy代理方式跨域

     proxy: {

       // 自定义请求的开头,使用代理方式处理/demo开头的请求,/xxx可以自定义

       "/demo": {

         // 往哪个服务器发请求

         target: "http://127.0.0.1:3000",

         pathRewrite: {

           // ^代表字符串开头,实际发送请求时,会把请求开头的/demo删除

           // 因为/demo并不是请求的一部分,只是个代理的标识

           "^/demo": "",

         },

       },

       // 如果有其他网址也需要跨域则继续配置

       // "/其他的...": {

       // target: "其他的请求地址",

       // pathRewrite: {

       // "^/其他的...": "",

       // },

       // },

     },

   },

 })

views/About.vue

 

 <template>

   <div class="about">

     <button @click="getTest()">getTest</button>

   </div>

 </template>

 ​

 <script>

 export default {

   methods: {

     getTest() {

       this.axios({

         method: "get",

         // 在原来的url上去掉http://127.0.0.1:3000换成/demo

         url: "/demo/getTest",

         params: { uid: 123 },

       }).then((res) => {

         console.log(res.data);

       });

     },

   },

 };

 </script>

22099be2380c4a2985c8141920cd4867.png

 

 

原理:

 

跨域是浏览器的安全策略,服务器和服务器之间发送请求没有跨域

 

在启动脚手架的时候会启动一个内置web服务器

 

请求的时候浏览器实际并没有直接和需要请求的服务器通信,而是通过内置的web服务器在中转

 

条件结构流程图.png

 

注意:

 

项目上线需要把打包后的文件放在服务器上运行,而不是启动脚手架运行,也就没有内置web服务器做代理,所以此方式只适用于开发测试阶段

 

上线时需要使用nginx代理或者服务器配置cors(每种语言有自己不同的配置方式)

 

express处理跨域

express中处理跨域需要使用cors模块

 

 npm i cors

app.js

 

 let express = require('express')

 // 引入cors模块

 var cors = require("cors");

 let app = express()

 ​

 app.listen(3000, () => {

     console.log('服务器已启动...')

 })

 ​

 // 配置跨域

 app.use(cors({

     // 允许跨域的服务器地址,可以写多个

     origin: ['http://localhost:8080', 'http://127.0.0.1:8080'],

     // 使用cookie时需要设置为true

     credentials: true

 }));

 ​

 app.use(express.static('./views'))

 ​

 app.get('/getTest', (req, res) => {

     console.log(req.query)

     res.send(req.query)

 })

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

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

相关文章

《中秋佳节倍思亲》——2022年这场中秋

中秋佳夜&#xff0c;圆的是月&#xff0c;满的是情&#xff0c;但一人终究扛下离愁 作为一个杭漂者&#xff0c;虽不及北漂般艰难困苦&#xff0c;但也举步维艰啊&#xff01; 或许&#xff0c;这对我而言&#xff0c;正是一个别样的中秋&#xff0c;也正是一个值得我一生纪念…

多端统一开发解决方案---Taro

Taro 一套代码&#xff0c;多端运行&#xff0c;释放双手的摸鱼神器 文章目录Taro 一套代码&#xff0c;多端运行&#xff0c;释放双手的摸鱼神器1. 简介2. 准备工作2.1 安装及使用2.1.1 开发者工具2.1.2 tarojs2.1安装tarojs工具3. Taro 使用4.限制5.路由跳转汇总6.注意事项7.…

vue3:安装配置sass

目录 前言&#xff1a; 1. 安装sass 2. 新建style目录&#xff0c;存放scss文件 3. main.ts 4. vite.config.ts 5. Test.vue 前言&#xff1a; 对于前端开发人员来说&#xff0c;css预处理的语言已经是家常便饭了&#xff0c;如sass&#xff0c;less等等&#xff0c;那么…

深度学习实战 1 YOLOv5结合BiFPN

目录 1. BiFPN论文简介 2. 在Common.py中添加定义模块(Concat) 3. 将类名加入进去&#xff0c;修改yolo.py 4. 修改train.py 5. 修改配置文件yolov5.yaml 1. BiFPN论文简介 论文《EfficientDet: Scalable and Efficient Object Detection》地址&#xff1a;https://arxiv…

微信小程序云开发的具体使用教程

小程序云开发介绍 云开发官方文档 一个小程序在开发时&#xff0c;除了考虑界面功能逻辑外&#xff0c;还需要后端的数据支持。而为了获得后端的数据支持&#xff0c;开发者需要提前考虑服务器、存储和数据库等需求&#xff0c;并且会花费时间精力在部署应用、依赖上。因此官方…

【JavaScript 逆向】网易易盾滑块逆向分析

声明本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01;案例目标验证码&#xff1a;aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc以上均做了脱敏处理&#xff0c;Base64 编码及解码方式&#xff1a;…

MongoDB数据库性能监控详解

目录一、MongoDB启动超慢1、启动日常卡住&#xff0c;根本不用为了截屏而快速操作&#xff0c;MongoDB启动真的超级慢~~2、启动MongoDB配置服务器&#xff0c;间歇性失败。3、查看MongoDB日志&#xff0c;分析“MongoDB启动慢”的原因。4、耗时“一小时”&#xff0c;MongoDB启…

color ui

color ui——组件使用 组件类型 ColorUI Vant webapp ColorUI 下载地址 Git地址 官网地址 简介 ColorUI是一个css库&#xff01;&#xff01;&#xff01;在你引入样式后可以根据class来调用组件&#xff0c;一些含有交互的操作我也有简单写&#xff0c;可以为你开发提供一…

微信小程序项目实例——我有一支画笔(画画)

微信小程序项目实例——我有一支画笔&#xff08;画画&#xff09; 文章目录微信小程序项目实例——我有一支画笔&#xff08;画画&#xff09;一、项目展示二、首页三、自由绘图四、照片绘图文末项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 我有一支画笔是一…

JS中let用法

JS中let用法 基本用法 Let命令用来声明变量。它的用法类似于var&#xff0c;但是所声明的变量。只在let命令所在的代码块内有效。 上面代码块中&#xff0c;分别用let和var声明了两个变量。然后在代码块之外调用这两个变量&#xff0c;结果let声明的变量报错&#xff0c;var声…

蓝桥杯刷题冲刺 | 倒计时28天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.卡片2.数字三角形3.购物单4.回文日期1.卡片 题目 链接&#xff1a; 卡片 - 蓝桥云课 (lanqiao…

echarts 柱状堆叠图(图例和x轴都是动态的)

问题描述&#xff1a; echarts柱状堆叠图&#xff0c;是很常用的图表&#xff0c;官网的例子很简单 。图例&#xff08;legend&#xff09;&#xff0c;x轴&#xff08;xAxis&#xff09;都是写死的。但是一般实际应用中都是 动态的。下面就举个例子&#xff0c;实现图例和x轴…

uniapp开发微信小程序自定义顶部导航栏

自定义导航栏渐变色&#xff0c;先上效果 使用uniapp开发小程序&#xff0c;在不同界面&#xff0c;要去对页面进行修改顶部导航栏。 比如说要去定义导航栏的背景颜色&#xff0c;常规的去定义导航栏背景颜色 全局定义导航栏 "window": {"navigationBarBackg…

猿创征文|一名大三学生的前端学习之路(真情流露)

✅ 作者简介&#xff1a;一名大三的大学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&#xf…

vue3中使用axios

vue3中使用axios 1.axios在vue3.x中的基础入门使用 在不涉及使用axios进行请求拦截以及响应拦截的场景下&#xff0c;axios的使用可以简化为以下步骤。 step1. 使用npm安装axios npm install axiosstep2. 我们将要使用的axios实例单独编写成一个js文件&#xff0c;文件夹可以建…

猿创征文|【C++游戏引擎Easy2D】学C++还不会绘制一个简单的二维图形?一篇文章教会你

&#x1f9db;‍♂️iecne个人主页&#xff1a;&#xff1a;iecne的学习日志 &#x1f4a1;每天关注iecne的作品&#xff0c;一起进步 &#x1f4aa;学C必看iecne 本文专栏&#xff1a;【C游戏引擎】. &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; ✨前…

【Vue组件间通信】 全局事件总线、订阅与发布

目录 一、全局事件总线 作用 安装 组件使用案例 案例分析 组件一&#xff08;小明&#xff09; 组件二&#xff08;小红&#xff09; 效果展示 二、订阅与发布 安装 组件使用案例 案例分析 组件一&#xff08;小明&#xff09; 组件二&#xff08;小红&#xff…

Python爬虫之Web自动化测试工具SeleniumChrome handless

​ ​ 作者 : SYFStrive 博客首页 : HomePage &#x1f967; 上一篇续文传送门 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;如果觉得文章对你有帮助可以点点关注…

Python流星雨代码

前言 用Python画场流星雨看看&#xff0c;源码见文末公众号哈。 流星类 def __init__(self): self.r ra.randint(50,100) self.t ra.randint(1,3) self.x ra.randint(-2000,1000) #流星的横坐标 self.y ra.randint(0,500) #流星…

出道即封神的ChatGPT,现在怎么样了?

从互联网的普及到智能手机&#xff0c;都让广袤的世界触手而及&#xff0c;如今身在浪潮中的我们&#xff0c;已深知其力。前阵子爆火的ChatGPT&#xff0c;不少人保持观望态度。现如今&#xff0c;国内关于ChatGPT的各大社群讨论&#xff0c;似乎沉寂了不少&#xff0c;现在怎…