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

清晰易懂的跨域请求知识——拿捏

1. 什么是跨域请求?

  • 简单来说:当你的 前端网页(例如 http://frontend.com)通过 JavaScript 调用 后端接口(例如 http://backend.com/api)时,如果两者的 域名、端口、协议 中任意一项不同,浏览器会认为这是「跨域请求」,默认会阻止请求(出于安全考虑)。
  • 核心限制:这个限制是由浏览器的 同源策略(Same-Origin Policy) 触发的,目的是防止恶意网站窃取用户数据。

2. 什么是「同源」?

  • 同源的定义:两个 URL 的以下三项必须完全相同
    1. 协议(如 http vs https
    2. 域名(如 frontend.com vs api.frontend.com
    3. 端口(如 80 vs 8080
  • 举例
    • 前端:http://localhost:3000
    • 后端:http://localhost:8080
    • 不同源!因为端口不同(3000 vs 8080)。

3. 为什么前后端分离会触发跨域问题?

在前后端分离架构中:

  • 前端:独立部署在一个服务器(如 http://frontend.com:3000)。
  • 后端:独立部署在另一个服务器(如 http://backend.com:8080)。
  • 问题:前端通过 JavaScript(如 fetchaxios)调用后端接口时,浏览器会拦截请求,并报错:
    Access to fetch at 'http://backend.com:8080/api/data' from origin 'http://frontend.com:3000' 
    has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    

4. 如何解决跨域问题?

方法 1:后端配置 CORS(推荐)
  • CORS(跨域资源共享):后端在响应头中添加允许跨域的规则。
  • 示例(以 Node.js 为例):
    // 后端代码
    const express = require('express');
    const app = express();// 添加 CORS 头
    app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', 'http://frontend.com:3000'); // 允许前端的域名res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');    // 允许的请求方法res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 允许的请求头next();
    });app.get('/api/data', (req, res) => {res.json({ message: 'Hello from backend!' });
    });app.listen(8080);
    
方法 2:前端代理(开发环境常用)
  • 原理:让前端服务器(如 webpack-dev-server)代理请求到后端,隐藏跨域。
  • 示例(React 项目配置):
    1. package.json 中添加代理:
      {"proxy": "http://backend.com:8080"
      }
      
    2. 前端代码直接请求 /api/data(而不是写完整后端地址):
      fetch('/api/data') // 实际请求会转发到 http://backend.com:8080/api/data.then(response => response.json());
      
方法 3:JSONP(历史方案,已淘汰)
  • 原理:利用 <script> 标签不受跨域限制的特性(仅支持 GET 请求)。
  • 示例
    // 前端
    function handleResponse(data) {console.log(data);
    }
    const script = document.createElement('script');
    script.src = 'http://backend.com:8080/api/data?callback=handleResponse';
    document.body.appendChild(script);// 后端返回
    handleResponse({ message: 'Hello from JSONP!' });
    

5. 实际场景示例

场景 1:前端调用后端 API
  • 前端代码(React):
    // 前端运行在 http://localhost:3000
    fetch('http://localhost:8080/api/data').then(response => response.json()).then(data => console.log(data));
    
  • 后端代码(Spring Boot):
    @RestController
    @CrossOrigin(origins = "http://localhost:3000") // 允许前端跨域
    public class DataController {@GetMapping("/api/data")public String getData() {return "Hello from backend!";}
    }
    
场景 2:浏览器报错示例

如果后端未配置 CORS,浏览器会拦截响应并提示:

Access to fetch at 'http://localhost:8080/api/data' from origin 'http://localhost:3000' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present.

6. 总结

  • 跨域的本质:浏览器为了安全限制不同源的请求。
  • 解决方法
    • 后端配置 CORS(生产环境推荐)。
    • 前端代理(开发环境常用)。
    • JSONP(已淘汰,仅作了解)。
  • 关键点:跨域是浏览器的行为,后端接口本身可以被调用,但需要明确告知浏览器允许跨域。

相关文章:

  • 《解锁CSS Flex布局:重塑现代网页布局的底层逻辑》
  • 实习技能记录【4】-----消息分发中的观察者模型
  • Canvas基础篇:绘制矩形
  • Git 实操:如何使用交互式 Rebase 移除指定提交(真实案例分享)
  • gradle 下载的tencent的镜像
  • Spark,集群搭建-Standalone
  • 企业战略管理(设计与工程师类)-2-战略规划及管理过程-2-外部环境分析-PESTEL模型实践
  • 从“丈量勘界”到“云端智管”:解码自然资源统一调查监测的智慧密码
  • Linux 下编译BusyBox
  • 《算法笔记》10.5小节——图算法专题->最小生成树 问题 B: Freckles
  • TTL、RS-232 和 RS-485 串行通信电平标准区别解析
  • 如何对多维样本进行KS检验
  • Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
  • Linux 权限管理
  • 【浙江大学DeepSeek公开课】DeepSeek的本地化部署与AI通识教育之未来
  • x86架构-k8s设置openebs的hostpath作为默认存储类的部署记录
  • LeetCode每日一题4.29
  • 省科学技术奖申报答辩PPT设计制作美化
  • 信息检索系统的组成部分和基本架构
  • 4月29日日记
  • 国台办:“台独”是绝路,外人靠不住
  • 黄宾虹诞辰160周年|一次宾翁精品的大集结
  • 2024“好评中国”网络评论大赛结果揭晓
  • 安徽省公安厅原副厅长刘海石主动投案,正接受审查调查
  • 绿地控股:今年一季度营业收入356亿元,中高层管理人员带头降薪
  • 看展览|建造上海:1949年以来的建筑、城市与文化