如何解决跨域请求中的 CORS 错误

聚沙成塔·每天进步一点点


本文回顾

  • ⭐ 专栏简介
  • 如何解决跨域请求中的 CORS 错误
    • 1. 引言
    • 2. 什么是 CORS?
      • 2.1 同源策略
        • 示例:
      • 2.2 CORS 请求的类型
    • 3. CORS 错误的原因
      • 3.1 常见 CORS 错误示例
    • 4. 解决 CORS 错误的常见方法
      • 4.1 在服务器端启用 CORS
        • 4.1.1 Node.js (Express) 中的 CORS 设置
        • 4.1.2 使用 Nginx 配置 CORS
      • 4.2 使用 JSONP 技术
        • 示例:
      • 4.3 使用代理服务器
        • 4.3.1 配置开发环境代理(如 Webpack)
      • 4.4 利用 CORS 中间件进行跨域处理
        • 示例:Django 中的 CORS 处理
      • 4.5 客户端绕过 CORS 限制
    • 5. 总结
  • ⭐ 写在最后

⭐ 专栏简介

前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个专栏中,我们将以问答形式每天更新,为大家呈现精选的前端知识点和常见问题解答。通过问答形式,我们希望能够更直接地回应读者们对于前端技术方面的疑问,并且帮助大家逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是各种常用框架和工具,我们将深入浅出地解释概念,并提供实际案例和练习来巩固所学内容。同时,我们也会分享一些实用技巧和最佳实践,帮助你更好地理解并运用前端开发中的各种技术。

在这里插入图片描述

无论你是寻找职业转型、提升技能还是满足个人兴趣,我们都将全力以赴,为你提供最优质的学习资源和支持。让我们一起探索Web开发的奇妙世界吧!加入前端入门之旅,成为一名出色的前端开发者! 让我们启航前端之旅!!!


如何解决跨域请求中的 CORS 错误

1. 引言

在现代前端开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种通过设置 HTTP 头来允许或阻止不同源之间的资源访问的机制。浏览器出于安全考虑,默认情况下会阻止跨域请求。本文将详细介绍 CORS 的工作原理、常见的 CORS 错误及其解决方案。

2. 什么是 CORS?

CORS 是一种浏览器安全机制,用于防止跨域资源请求带来的潜在安全风险。浏览器在执行跨域请求时,会检查目标服务器是否允许访问。如果服务器没有正确设置 CORS 头信息,浏览器将阻止跨域请求,并返回 CORS 错误。

2.1 同源策略

CORS 是基于**同源策略(Same-Origin Policy)**的。所谓同源,指的是协议(scheme)、域名(hostname)和端口号(port)三者完全一致。同源策略规定,只有同源的请求才会被允许访问。跨域请求,即不同源的请求,需要通过 CORS 头来管理。

示例:

以下两个 URL 属于同源:

  • https://example.com
  • https://example.com:443

而以下 URL 则属于跨域请求:

  • https://api.example.com(域名不同)
  • https://example.com:8080(端口不同)
  • http://example.com(协议不同)

2.2 CORS 请求的类型

CORS 请求可以分为以下两种类型:

  • 简单请求:GET、POST、HEAD 等方法且没有自定义的 HTTP 头信息,浏览器直接发送请求。
  • 预检请求(Preflight Request):对非简单请求(如 PUT、DELETE 或自定义头信息)会先发送 OPTIONS 请求,确认服务器是否允许再发送实际请求。

3. CORS 错误的原因

浏览器在处理跨域请求时,如果没有收到目标服务器的明确许可(通过 CORS 头信息),会抛出 CORS 错误,常见错误包括:

  • Access-Control-Allow-Origin 头缺失或配置错误
  • Access-Control-Allow-Methods 头未正确配置允许的 HTTP 方法
  • Access-Control-Allow-Headers 头未正确声明自定义的请求头

3.1 常见 CORS 错误示例

浏览器控制台中常见的 CORS 错误信息如下:

Access to XMLHttpRequest at 'https://api.example.com/data' from origin 'https://your-site.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这类错误通常意味着目标服务器未设置 CORS 头信息或配置不正确,导致浏览器阻止了该请求。

4. 解决 CORS 错误的常见方法

解决 CORS 错误的关键在于正确设置服务器的响应头信息,以允许浏览器发送跨域请求。常见的解决方法有以下几种。

4.1 在服务器端启用 CORS

最直接的解决方案是在服务器端启用 CORS,允许浏览器的跨域请求。不同的服务器框架有不同的设置方法。

4.1.1 Node.js (Express) 中的 CORS 设置

在 Node.js 使用 Express 框架时,可以通过 cors 中间件启用 CORS:

const express = require('express');
const cors = require('cors');
const app = express();// 启用所有域名的 CORS 请求
app.use(cors());// 限制指定域名的 CORS 请求
app.use(cors({origin: 'https://your-site.com'
}));app.get('/api/data', (req, res) => {res.json({ message: 'CORS enabled' });
});app.listen(3000, () => {console.log('Server running on port 3000');
});
4.1.2 使用 Nginx 配置 CORS

对于使用 Nginx 作为服务器的应用,可以在 Nginx 的配置文件中添加 CORS 头:

server {location /api/ {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept';# 处理预检请求if ($request_method = 'OPTIONS') {return 204;}}
}

4.2 使用 JSONP 技术

JSONP(JSON with Padding) 是一种通过 <script> 标签实现跨域请求的技术,适用于 GET 请求。它绕过了浏览器的同源策略,因为 <script> 标签不受同源策略限制。

示例:

客户端发出 JSONP 请求:

<script>function handleResponse(data) {console.log(data);}var script = document.createElement('script');script.src = 'https://api.example.com/data?callback=handleResponse';document.body.appendChild(script);
</script>

服务器返回的数据格式为:

handleResponse({"message": "This is a JSONP response"
});

JSONP 的局限性在于它仅支持 GET 请求,且存在一定的安全风险,因为它在执行脚本。

4.3 使用代理服务器

另一种解决 CORS 错误的方式是使用代理服务器。代理服务器充当客户端与目标服务器之间的中介,前端请求代理服务器,代理服务器再向目标服务器发送请求。

4.3.1 配置开发环境代理(如 Webpack)

在开发过程中,可以通过配置 Webpack 开启代理,以避免 CORS 错误:

// webpack.config.js
module.exports = {devServer: {proxy: {'/api': {target: 'https://api.example.com',changeOrigin: true,pathRewrite: { '^/api': '' },},},},
};

在这个例子中,前端代码中的 /api 请求将会被代理到 https://api.example.com,从而避免 CORS 限制。

4.4 利用 CORS 中间件进行跨域处理

在某些情况下,可以通过在服务器端添加中间件或插件来处理跨域问题。例如,在某些云服务或后端框架中,提供了现成的 CORS 插件,简单启用即可。

示例:Django 中的 CORS 处理

在 Django 中,使用 django-cors-headers 库处理跨域请求:

pip install django-cors-headers

settings.py 文件中添加配置:

INSTALLED_APPS = [...'corsheaders',...
]MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',...
]# 允许所有域名跨域请求
CORS_ALLOW_ALL_ORIGINS = True

4.5 客户端绕过 CORS 限制

在某些开发调试场景下,开发者可能会选择在客户端临时禁用浏览器的 CORS 限制,这通常不建议在生产环境使用,但可以作为调试工具。

例如,使用 Chrome 浏览器的开发者模式,启动时添加 --disable-web-security 标志,暂时绕过 CORS 保护机制。

5. 总结

CORS 是浏览器为保证安全性而实施的一项重要机制,旨在防止恶意的跨域请求。在跨域请求开发中,解决 CORS 错误的关键是正确配置服务器的响应头。常见的解决方案包括在服务器端启用 CORS、使用 JSONP、代理服务器以及中间件等技术。了解并熟练使用这些方法,可以有效避免 CORS 错误,保证跨域请求的正常工作。


⭐ 写在最后

本专栏适用读者比较广泛,适用于前端初学者;或者没有学过前端对前端有兴趣的伙伴,亦或者是后端同学想在面试过程中能够更好的展示自己拓展一些前端小知识点,所以如果你具备了前端的基础跟着本专栏学习,也是可以很大程度帮助你查漏补缺,由于博主本人是自己再做内容输出,如果文中出现有瑕疵的地方各位可以通过主页的左侧联系我,我们一起进步,与此同时也推荐大家几份专栏,有兴趣的伙伴可以订阅一下:除了下方的专栏外大家也可以到我的主页能看到其他的专栏;

前端小游戏(免费)这份专栏将带你进入一个充满创意和乐趣的世界,通过利用HTML、CSS和JavaScript的基础知识,我们将一起搭建各种有趣的页面小游戏。无论你是初学者还是有一些前端开发经验,这个专栏都适合你。我们会从最基础的知识开始,循序渐进地引导你掌握构建页面游戏所需的技能。通过实际案例和练习,你将学会如何运用HTML来构建页面结构,使用CSS来美化游戏界面,并利用JavaScript为游戏添加交互和动态效果。在这个专栏中,我们将涵盖各种类型的小游戏,包括迷宫游戏、打砖块、贪吃蛇、扫雷、计算器、飞机大战、井字游戏、拼图、迷宫等等。每个项目都会以简洁明了的步骤指导你完成搭建过程,并提供详细解释和代码示例。同时,我们也会分享一些优化技巧和最佳实践,帮助你提升页面性能和用户体验。无论你是想寻找一个有趣的项目来锻炼自己的前端技能,还是对页面游戏开发感兴趣,前端小游戏专栏都会成为你的最佳选择。点击订阅前端小游戏专栏

在这里插入图片描述

Vue3通透教程【从零到一】(付费) 欢迎来到Vue3通透教程!这个专栏旨在为大家提供全面的Vue3相关技术知识。如果你有一些Vue2经验,这个专栏都能帮助你掌握Vue3的核心概念和使用方法。我们将从零开始,循序渐进地引导你构建一个完整的Vue应用程序。通过实际案例和练习,你将学会如何使用Vue3的模板语法、组件化开发、状态管理、路由等功能。我们还会介绍一些高级特性,如Composition API和Teleport等,帮助你更好地理解和应用Vue3的新特性。在这个专栏中,我们将以简洁明了的步骤指导你完成每个项目,并提供详细解释和示例代码。同时,我们也会分享一些Vue3开发中常见的问题和解决方案,帮助你克服困难并提升开发效率。无论你是想深入学习Vue3或者需要一个全面的指南来构建前端项目,Vue3通透教程专栏都会成为你不可或缺的资源。点击订阅Vue3通透教程【从零到一】专栏

在这里插入图片描述

TypeScript入门指南(免费) 是一个旨在帮助大家快速入门并掌握TypeScript相关技术的专栏。通过简洁明了的语言和丰富的示例代码,我们将深入讲解TypeScript的基本概念、语法和特性。无论您是初学者还是有一定经验的开发者,都能在这里找到适合自己的学习路径。从类型注解、接口、类等核心特性到模块化开发、工具配置以及与常见前端框架的集成,我们将全面覆盖各个方面。通过阅读本专栏,您将能够提升JavaScript代码的可靠性和可维护性,并为自己的项目提供更好的代码质量和开发效率。让我们一起踏上这个精彩而富有挑战性的TypeScript之旅吧!点击订阅TypeScript入门指南专栏

在这里插入图片描述

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

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

相关文章

使用Jlink打印单片机的调试信息

1.在工程中添加6个文件 除去RTT_Debug.h外的其他几个文件在jlink安装目录 RTT_Debug.h的内容如下 #ifndef _RTT_H_ #define _RTT_H_#include "SEGGER_RTT.h"#define STR_DEBUG //#define USART_DEBUG#define DBGLOG #define DBGWARNING #define DBGERROR#if def…

【自动驾驶】基于车辆几何模型的横向控制算法 | Stanley 算法详解与编程实现

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践

RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合了信息检索&#xff08;Retrieval&#xff09;和生成模型&#xff08;Generation&#xff09;的技术&#xff0c;旨在提高生成模型的性能和准确性。RAG 技术通过在生成过程中引入外部知识库&#xff0c;使…

设计模式之装饰模式(Decorator)

前言 这个模式带给我们有关组合跟继承非常多的思考 定义 “单一职责” 模式。动态&#xff08;组合&#xff09;的给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少…

深入探索卷积神经网络(CNN)

深入探索卷积神经网络&#xff08;CNN&#xff09; 前言图像的数字表示灰度图像RGB图像 卷积神经网络&#xff08;CNN&#xff09;的架构基本组件卷积操作填充&#xff08;Padding&#xff09;步幅&#xff08;Strides&#xff09; 多通道图像的卷积池化层全连接层 CNN与全连接…

c++难点核心笔记(二)

系列文章目录 c难点&核心笔记(一) 继续接着上一章记录的重点内容包括函数&#xff0c;类和对象&#xff0c;指针和引用&#xff0c;C对象模型和this指针等内容&#xff0c;继续给大家分享&#xff01;&#xff01; 文章目录 系列文章目录友元全局函数做友元类做友元成员函…

傅里叶变换及其应用笔记

傅里叶变换 预备知识学习路线扼要描述两者之间的共同点&#xff1a;线性运算周期性现象对称性与周期性的关系周期性 预备知识 学习路线 从傅里叶级数&#xff0c;过度到傅里叶变换 扼要描述 傅里叶级数&#xff08;Fourier series&#xff09;&#xff0c;几乎等同于周期性…

springboot中药材进存销管理系统

基于springbootvue实现的中药材进存销管理系统 &#xff08;源码L文ppt&#xff09;4-079 4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化&#xff0c;分成一个个小的容易解决的板块&#xff0c;然…

二叉树进阶oj题【二叉树相关10道oj题的解析和代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历&#xff0c;非递归迭代实现9.二叉树中序遍历 &…

从0新建一个微信小程序实现一个简单跳转

首先 1.从这里下载开发工具 https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.htm 2. 等下载完毕后 创建一个空白项目 在pages目录下右键创建一个page : testUI,这时候会生成四个文件 新建一个文件夹 testUI 给他们放一起 3.增加一个按钮 …

SaaS(Software as a Service)软件的主流技术架构

在当今数字化时代&#xff0c;SaaS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;软件以其灵活、高效和成本效益高的特点&#xff0c;成为企业信息化建设的首选。为了实现SaaS软件的稳定、可靠和高效运行&#xff0c;其技术架构的设计显得尤为重要。本文…

【好书推荐】《架构真意:企业级应用架构设计方法论与实践》

在快速迭代的互联网和大数据时代&#xff0c;企业级应用架构设计成为了企业技术创新的基石。《架构真意&#xff1a;企业级应用架构设计方法论与实践》一书&#xff0c;由范钢和孙玄两位资深架构师联袂撰写&#xff0c;不仅为工程师、架构师和管理者提供了一套深入且实用的架构…

Humanoid 3D Charactor_P08_Federica

3D模型(人形装备)女孩 “P08_联邦” 内容仅为3D人物模型。 图片中的背景和家具不包括在内。 由Blender制作 包括: 1. 人形机器人3D模型和材质。 2. “Unity-chan!”着色器。 性别:女 装备:人形 皮肤网格:4个骨骼权重 多边形: 20000~40000 纹理分辨率:2K纹理 混合形状:…

828华为云征文|Flexus X实例安装ShowDoc文档管理工具

828华为云征文&#xff5c;Flexus X实例安装showdoc文档管理工具 引言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 主要使用场景 二、购买Flexus云服务器X实例2.1 购买规格参考2.2 查看Flexus云服务器X实例状态 三、远程连接Flexus云服务器X实例3.1 重置密码3.…

页面在移动设备上显示不正常的原因及解决方案

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介页面在移动设备上显示不正常的原因及解决方案1. 缺少 viewport 元标签1.1 问题描述1.2 解决方案1.3 注意事项 2. 响应式设计未实现或设计不当2.1 问题描述2.2 解决方案示例&#xff1a;媒体查询的使用 2.3 常见的媒体查询断点 3. 固…

【C++取经之路】红黑树封装set

目录 前言 红黑树的结构 红黑树的结点定义 红黑树的迭代器 红黑树 封装set 前言 本文参考《STL源码剖析》中SGI STL对红黑树的结构设计&#xff0c;涉及到红黑树迭代器的实现等&#xff0c;所以在读这篇文章之前&#xff0c;我希望你对红黑树有一定的了解&#xff0c;比如…

网站建设中,常用的后台技术有哪些,他们分别擅长做什么网站平台

PHP、Python、JavaScript、Ruby、Java和.NET各自适用于不同类型的网站平台。以下是对这些编程语言适用场景的具体介绍&#xff1a; PHP Web开发&#xff1a;PHP是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合Web开发。全球有超过80%的网站使用PHP作为服务器端编程语…

SuperMap GIS基础产品FAQ集锦(20240923)

一、SuperMap iDesktopX 问题1&#xff1a;请问一下&#xff0c;桌面11i导入功能好像有bug&#xff0c;shp导入到pg库中丢数据&#xff0c;明明60多万条但是导入进去只剩13万条了&#xff0c;这个哪位同事能处理一下呢 11.2.0 【问题原因】2个问题原因&#xff1a;1、序列已…

两张图讲透软件测试实验室认证技术体系与质量管理体系

软件测试实验室在申请相关资质认证时&#xff0c;需要建立一套完整的质量管理体系和过硬的技术体系。这其中涉及到的要素非常繁杂&#xff0c;工作量非常庞大&#xff0c;为了帮助大家快速梳理清楚软件测试实验室认证过程中质量管理体系和技术体系的建设思路&#xff0c;我们梳…

HttpServletRequest简介

HttpServletRequest是什么&#xff1f; HttpServletRequest是一个接口&#xff0c;其父接口是ServletRequest&#xff1b;HttpServletRequest是Tomcat将请求报文转换封装而来的对象&#xff0c;在Tomcat调用service方法时传入&#xff1b;HttpServletRequest代表客户端发来的请…