【CORS 报错】跨域请求问题:CORS 多种环境下的解决方案

news2024/9/9 4:41:02

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、CORS错误的常见原因
    • 二、解决方案
      • 1. Vue3 + Vite项目下的解决方案
        • 创建Vue3 + Vite项目
        • 配置Vite的代理
        • 发送请求
      • 2. jQuery项目下的解决方案
        • 使用CORS请求头
        • 使用JSONP
      • 3. 其他环境下的解决方案
        • 使用服务器端代理
            • 设置CORS头
            • 使用Nginx配置代理
    • 三、总结

在这里插入图片描述

跨域资源共享(CORS, Cross-Origin Resource Sharing)问题是前端开发中的常见挑战。本文将详细介绍在不同环境下(如Vue3 + Vite项目、jQuery项目以及其他环境下)的解决方案。


一、CORS错误的常见原因

跨域问题的本质是浏览器出于安全考虑,限制从一个源(域、协议、端口)加载资源到另一个源。这种安全机制被称为“同源策略”。同源策略规定,只有当请求的URL与当前网页的URL具有相同的协议、域名和端口时,浏览器才允许该请求通过。

  1. 缺乏CORS头
    服务器没有设置正确的CORS响应头,导致浏览器拒绝请求。例如,浏览器期望服务器响应中包含 Access-Control-Allow-Origin 头,如果没有设置该头,浏览器会阻止请求。

  2. 跨域请求被禁止
    默认情况下,浏览器会阻止跨域请求以保护用户的安全。如果服务器没有允许特定的域进行访问,浏览器会抛出CORS错误。

  3. 预检请求失败
    对于一些复杂的请求,浏览器会发送一个预检请求(OPTIONS请求)来确认服务器是否允许该请求。如果预检请求失败,则会导致CORS错误。


二、解决方案

1. Vue3 + Vite项目下的解决方案

通过Vite的开发服务器代理功能,可以将本地的请求代理到不同的服务器,从而避免跨域问题。以下是具体步骤:

创建Vue3 + Vite项目
npm create vite@latest
cd your-project-name
npm install

选择Vue3模板,并进入项目目录。

配置Vite的代理

在Vite项目的根目录下找到vite.config.ts(或vite.config.js),并进行以下配置:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: {
    proxy: {
      '/api': {
        target: 'http://api.example.com', // 目标服务器
        changeOrigin: true, // 是否改变请求源
        rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径
      },
    },
  },
});
发送请求

在Vue组件中,可以通过axios或者fetch发送请求。例如:

<template>
  <div>
    <button @click="fetchData">获取数据</button>
    <div v-if="data">{{ data }}</div>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';
import axios from 'axios';

export default defineComponent({
  setup() {
    const data = ref(null);

    const fetchData = async () => {
      try {
        const response = await axios.get('/api/data');
        data.value = response.data;
      } catch (error) {
        console.error('请求错误:', error);
      }
    };

    return {
      data,
      fetchData,
    };
  },
});
</script>

2. jQuery项目下的解决方案

在jQuery项目中,可以通过设置请求头或使用JSONP来解决CORS问题。

使用CORS请求头

确保服务器设置了正确的CORS头,如 Access-Control-Allow-Origin。在客户端发起请求时:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
  $.ajax({
    url: 'http://api.example.com/data',
    method: 'GET',
    success: function(data) {
      console.log(data);
    },
    error: function(xhr, status, error) {
      console.error('请求错误:', error);
    }
  });
</script>
使用JSONP

如果服务器支持JSONP,可以通过以下方式解决跨域问题:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
  $.ajax({
    url: 'http://api.example.com/data',
    method: 'GET',
    dataType: 'jsonp', // 使用JSONP
    success: function(data) {
      console.log(data);
    },
    error: function(xhr, status, error) {
      console.error('请求错误:', error);
    }
  });
</script>

3. 其他环境下的解决方案

使用服务器端代理

在许多情况下,可以在服务器端设置一个代理,将跨域请求通过服务器端转发。例如,在Node.js中可以使用http-proxy-middleware

const { createProxyMiddleware } = require('http-proxy-middleware');

app.use('/api', createProxyMiddleware({
  target: 'http://api.example.com',
  changeOrigin: true,
  pathRewrite: {
    '^/api': '',
  },
}));
设置CORS头

确保服务器响应中包含正确的CORS头。例如,在Node.js + Express中:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});

app.get('/data', (req, res) => {
  res.json({ message: 'Hello World' });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});
使用Nginx配置代理

在Nginx中,可以通过配置代理解决CORS问题:

server {
    listen 80;
    server_name yourdomain.com;

    location /api/ {
        proxy_pass http://api.example.com/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

三、总结

CORS问题是前端开发中常见的一个挑战,但通过合理的代理配置和服务器设置可以有效解决。在不同环境下,可以使用Vite的代理功能、设置请求头、JSONP、服务器端代理、Nginx代理等多种方式来解决跨域问题。希望本文对你理解和解决CORS问题有所帮助。

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

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

相关文章

使用django-haystack+whoosh实现全文搜索

前言 好像是上个星期在写代码的时候遇到了一些问题&#xff0c;这个问题似乎我之前也遇到过&#xff0c;印象中好像也写博客进行记录了的&#xff0c;于是就想在我的博客系统中“查找”&#xff08;表示很无奈居然没有搜索功能&#x1f979;&#x1f979;&#xff09;&#xff…

python--实验 9 类和对象

知识点 面向对象编程思想 面向对象编程是一种编程范式&#xff0c;它使用“对象”来设计软件&#xff0c;这些对象可以包含数据和代码&#xff0c;即属性和方法。 面向对象的程序设计的核心是对象,世间存在的万物皆为对象&#xff08;上帝式思维&#xff09; 面向对象&#xf…

科普文:一天学会shell编程

1.shell概叙 本文将从shell执行、语法、实战三个方面来讲解shell编程&#xff0c;其实shell编程就是个批处理&#xff0c;将你平时在服务器上单独执行的命令&#xff0c;按照一定要求组织起来&#xff0c;写在一起&#xff0c;然后统一执行&#xff0c;就完事了。 对于运维人员…

零基础小白人手必备“新华字典”,涵盖入门到进阶,超全语法!精炼总结64页,背完你的Python就牛了!

《Python背记手册》是一本旨在帮助初学者快速入门Python的实用手册&#xff0c;其特点鲜明&#xff0c;内容全面且易于理解。 书籍PDF已打包好&#xff0c;戳这里领取 一、书籍基本信息 作者&#xff1a;书籍的作者通常具有深厚的Python开发背景&#xff0c;有的作者是在美国攻…

MAVSDK示例takeoff_and_land编译与使用

1.克隆MAVSDK源码 ,示例位于源码的examples中 2.安装MAVSDK,下载https://github.com/mavlink/MAVSDK/releases/download/v2.12.2/mavsdk-windows-x64-release.zip 下载后解压:

三星首款智能戒指 Galaxy Ring 将于7月24日上市,售价399美元

三星电子即将推出其首款智能戒指——Galaxy Ring&#xff0c;这款创新的可穿戴设备将于7月24日上市&#xff0c;定价为399美元。Galaxy Ring的亮相标志着三星在智能穿戴设备领域的新突破&#xff0c;它不仅证明了三星在技术革新上的持续能力&#xff0c;也显示了其在健康和健身…

编号根据规则自增生成,及spring事务和锁

1、 背景 需要根据一些规则来生成自增编号&#xff0c;比如&#xff1a;95JS0001&#xff0c;950002 95JS是固定的&#xff0c;而后缀的0001的长度也是可配置的&#xff0c;因为有一张表来进行维护 CREATE TABLE number_control (id bigint NOT NULL AUTO_INCREMENT COMMENT 主…

DW03D是一款用于锂离子/聚合物电池保护的高集成度解决方案。DW03D包含内部功率MOSFET、高精度电压检测电路和延迟电路

一般概述 DW03D产品是单节锂离子/锂聚合物可充电电池组保护的高集成度解决方案。DW03D包括了先进的功率MOSFET&#xff0c;高精度的电压检测电路和延时电路。 DW03D具有非常小的TSS08-8的封装,这使得该器件非常适合应用于空间限制得非常小的可充电电池组应用。…

生信软件25 - 三代测序数据灵敏比对工具ngmlr

1. ngmlr简介 CoNvex Gap-cost Ments for Long Reads&#xff08;ngmlr&#xff09;是一种长reads比对工具&#xff0c;可以将PacBio或Oxford Nanopore灵敏地与&#xff08;大&#xff09;参考基因组&#xff08;比如人类参考基因组&#xff09;对齐&#xff0c;能快速和正确地…

OpenSSH Server远程代码执行漏洞 (CVE-2024-6387)|centos7升级到最新版本OpenSSH-9.8.p1

一、漏洞概述 漏洞名称 OpenSSH Server远程代码执行漏洞 CVE ID CVE-2024-6387 漏洞类型 竞争条件 发现时间 2024-07-01 漏洞评分 暂无 漏洞等级 高危 攻击向量 网络 所需权限 无 利用难度 高 用户交互 无 PoC/EXP 未公开 在野利用 未发现 OpenS…

MechMind结构光相机 采图SDK python调用

测试效果 Mech-Mind结构光相机 Mech Mind&#xff08;梅卡曼德&#xff09;的结构光相机&#xff0c;特别是Mech-Eye系列&#xff0c;是工业级的高精度3D相机&#xff0c;广泛应用于工业自动化、机器人导航、质量检测等多个领域。以下是对Mech Mind结构光相机的详细解析&#…

阿里巴巴国际站携手NBA传奇托尼·帕克,中国卖家又一波利好!

在全球化浪潮日益汹涌的今天&#xff0c;跨界合作已成为推动品牌国际化进程的重要力量。近日&#xff0c;阿里巴巴国际站宣布了一项震撼业界的合作——正式签约NBA&#xff08;美国职业篮球联赛&#xff09;传奇控球后卫托尼帕克&#xff08;Tony Parker&#xff09;作为其全球…

2024年10款免费的项目管理软件推荐

本文向大家推荐10款2024年免费使用的项目管理软件&#xff0c;其中包括桌面应用和基于Web平台的多种产品&#xff0c;同时还涵盖了一些优秀的开源软件。 1.禅道开源项目管理软件 禅道是一款开源的、基于Web的项目管理软件&#xff0c;其功能丰富且操作简便&#xff0c;为团队提…

生产管理系统功能全拆解:哪些功能是企业真正需要的?

制造业的伙伴经常听到“生产管理”&#xff0c;但很多人可能只是模糊地知道它与工厂、生产线有关。那么&#xff0c;到底什么是生产管理呢&#xff1f;它的重要性又体现在哪里呢&#xff1f;接下来&#xff0c;我就以轻松的方式&#xff0c;带大家走进生产管理的世界&#xff0…

笔记:Qt开发之工程的多模块设计(pri)

目标&#xff1a;对于功能模块较多的Qt项目&#xff0c;使用pri文件管理模块文件&#xff0c;降低工程复杂度&#xff0c;提高软件模块的封装性和重用性。 一、知识储备 1.1 pro与pri文件 对于模块化编程&#xff0c;Qt提供了pro和pri&#xff0c;pro管理项目&#xff0c;pri…

算法 —— 模拟

目录 替换所有的问号 提莫攻击 Z字形变换 外观数列 各位读者有听说过“建模”一词吗&#xff1f;所谓“建模”&#xff0c;就是把事物进行抽象&#xff0c;根据实际问题来建立对应的数学模型。“抽象”并不意味着晦涩难懂&#xff1b;相反&#xff0c;它提供了大量的便利。…

新兴商业模式如何破局?市场策划专家的实战指南

在这个融合了传统市场、互联网和信息技术的大潮中&#xff0c;想要在市场营销策划上玩得转&#xff0c;咱们得有超凡的全局思维和跨界的协作精神。 下面&#xff0c;我就来和大家聊聊如何在这样一个复杂环境下搞定市场营销策划&#xff0c;让你在竞争激烈的市场中脱颖而出。 …

Ubuntu编译PX4固件

目录 前言 准备编译参考 前言 要想自己编译PX4固件需要交叉编译器&#xff0c;交叉编译器可以将 x86架构 平台上写好程序编译出来&#xff0c;而编译出来的可执行文件是能用到 arm架构 的平台上。 本次编译是以 px4 v1.13.2 为例。 我的配置如下&#xff1a; 虚拟机 Ubuntu 18…

微气象仪的工作原理

型号推荐&#xff1a;云境天合TH-WQX5】风力发电传感器在风力发电系统中起着至关重要的作用&#xff0c;它们能够实时监测和记录各种关键参数&#xff0c;为风力发电机组的控制提供数据支持&#xff0c;从而确保风力发电系统的安全、高效运行。以下是对风力发电传感器的详细解析…

喜讯|华院计算法律大模型入围《2024大模型典型示范应用案例集》

2024年世界人工智能大会&#xff08;WAIC&#xff09;举办期间&#xff0c;中国信通院正式发布了《2024大模型典型示范应用案例集》&#xff08;以下简称《案例集》&#xff09;。该案例集由中国信通院华东分院、上海人工智能实验室主导&#xff0c;以产业化为导向&#xff0c;…