当前位置: 首页 > news >正文

CORS跨域资源共享解析

在这里插入图片描述

跨域处理中的 CORS(Cross-Origin Resource Sharing,跨域资源共享) 是浏览器强制执行的一种安全机制,用于控制网页中不同“源”(协议+域名+端口)之间的资源交互。以下是通俗解释和核心要点:


为什么需要 CORS?

  1. 浏览器的同源策略(Same-Origin Policy)
    默认情况下,浏览器禁止网页向“不同源”的服务器发送请求(例如:https://a.com 的页面不能直接请求 https://b.com 的数据)。这是为了防止恶意网站窃取用户数据。

  2. 合理跨域的需求
    实际开发中,前后端分离项目(前端 http://localhost:3000,后端 http://api.example.com)或调用第三方 API 时,必须合法地突破同源限制。


CORS 如何工作?

当浏览器检测到跨域请求时,会自动添加 Origin 请求头(标明请求来源),并检查服务器的响应头是否包含允许该来源的声明。流程分两类:

1. 简单请求(Simple Request)
  • 条件:请求方法为 GET/POST/HEAD,且请求头为简单字段(如 Content-Type: text/plain)。
  • 过程
    1. 浏览器直接发送跨域请求,并在 Origin 头中声明来源。
    2. 服务器响应需包含:
      Access-Control-Allow-Origin: https://your-frontend.com  // 或 *(允许任意源)
      
    3. 浏览器检查通过后,前端才能拿到响应。
2. 预检请求(Preflight Request)
  • 触发条件:复杂操作(如 PUTDELETE,或自定义请求头如 Authorization)。
  • 过程
    1. 浏览器先发送 OPTIONS 请求(预检),询问服务器是否允许跨域。
    2. 服务器响应需包含:
      Access-Control-Allow-Origin: https://your-frontend.com
      Access-Control-Allow-Methods: GET, POST, PUT      // 允许的方法
      Access-Control-Allow-Headers: Content-Type, Token // 允许的请求头
      
    3. 预检通过后,浏览器才发送真实请求。

服务端如何配置 CORS?

以 Node.js(Express)为例:

const express = require('express');
const app = express();// 允许跨域中间件
app.use((req, res, next) => {res.setHeader('Access-Control-Allow-Origin', 'https://your-frontend.com'); // 或谨慎使用 *res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');res.setHeader('Access-Control-Allow-Credentials', 'true'); // 允许携带Cookienext();
});// 处理预检请求
app.options('*', (req, res) => res.sendStatus(200));

常见问题与解决

  1. 浏览器报错 CORS policy blocked

    • 检查服务端是否正确设置了 Access-Control-Allow-Origin 等响应头。
    • 确保 Origin 值在服务端白名单内(不能同时使用 *Credentials)。
  2. 携带凭证(Cookies)
    需同时满足:

    • 客户端设置:fetch(url, { credentials: 'include' })
    • 服务端设置:Access-Control-Allow-Credentials: true
    • Access-Control-Allow-Origin 必须是具体域名(不能用 *)。
  3. 预检请求失败(OPTIONS 405)
    确保服务器正确处理了 OPTIONS 方法(如示例中的 app.options())。


替代方案(不推荐)

  • JSONP(仅 GET 请求):利用 <script> 标签跨域,但安全性低。
  • 代理服务器:前端请求同源代理,由代理转发请求(适用于无法修改服务端的情况)。

总结

概念说明
CORS 本质服务端通过响应头声明允许哪些外部源访问资源。
浏览器角色拦截跨域响应,依据服务端响应头决定是否放行。
关键响应头Access-Control-Allow-OriginAllow-MethodsAllow-Headers 等。
开发必备后端正确配置 CORS 头,前端处理凭证和预检流程。

理解 CORS 是前后端协同开发的基础,正确配置可避免 80% 的跨域问题。务必通过服务端控制资源权限,而非关闭浏览器安全设置!

http://www.xdnf.cn/news/688339.html

相关文章:

  • 算法刷题记录:滑动窗口经典题目解析
  • 【大模型原理与技术-毛玉仁】第三章 Prompt工程
  • web-css
  • 20250528-C#知识:函数简介及函数重载
  • 外部访问可视化监控 Grafana (Windows版本)
  • 扇形 圆形 面积公式
  • 如何在WordPress中选择最佳Elementor主题:专家指南
  • 前端大文件上传-断点续传
  • 影刀RPA-17- 列表练习
  • 使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)
  • 如果是在服务器的tty2终端怎么查看登陆服务器的IP呢
  • 《vue.js快速入门》链接摘抄整理
  • 深入理解SQLMesh中的Lookback、Forward-Only和Auto-Restatement特性
  • 【GlobalMapper精品教程】095:如何获取无人机照片的拍摄方位角
  • Redis keydb dragonfly skytable
  • 《全面解析鸿蒙相关概念:鸿蒙、开源鸿蒙、鸿蒙 Next 有何区别》
  • 【R语言编程绘图-调色】
  • css3 新增属性/滤镜效果/裁剪元素/图片适应盒子/定义和使用变量/恢复默认initial
  • 使用electron创建应用程序的基础步骤
  • 基于 HEC-RAS 与 ArcGIS 的洪水危险性评估技术— 从地形分析到淹没模拟的全流程实践
  • webpack的安装及其后序部分
  • 【ArcGIS Pro微课1000例】0071:将无人机照片生成航线、轨迹点、坐标高程、方位角
  • 从技术到实践:ArcGIS 与 HEC-RAS 解析洪水危险性及风险评估
  • v1.05 支付宝 绑定时写Nand flash卡死问题
  • 致远OA与用友U8集成实现制造业设备追溯全过程方案分析
  • Java jdk8版本特性(未完成版)
  • Vue.js教学第十七章:Vue 与后端交互(一),Axios 基础
  • mysql 迁移金仓,sys_use表查询报错,指定search_path后任然报错的问题
  • React 泛型组件:用TS来打造灵活的组件。
  • 前端面经 React常见的生命周期