当前位置: 首页 > 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(已淘汰,仅作了解)。
  • 关键点:跨域是浏览器的行为,后端接口本身可以被调用,但需要明确告知浏览器允许跨域。
http://www.xdnf.cn/news/218089.html

相关文章:

  • 前端与后端开发详解:从概念到就业技能指南
  • 解锁健康密码,开启养生新旅程
  • 空间权重矩阵
  • 体育直播源码NBA足球直播M29模板赛事直播源码
  • Linux日志系统大揭秘-系统故障排查安全审计
  • openssl_error_string() 不要依赖错误信息作为逻辑判断
  • JVM | CMS垃圾收集器详解
  • OVP UVP与UVLO对比
  • 2025年DDoS攻击防御全解析:应对超大流量的实战策略
  • Springboot使用jwt实现登录认证
  • Gitea windows服务注册,服务启动、停止、重启脚本
  • JavaScript面试问题
  • 研读论文——电子科技大学《通过专家混合实现多类型上下文感知的对话推荐系统》
  • antd-vue表单实现一个临时校验效果
  • DeepSeek+Dify之六通过API调用工作流
  • 头歌java课程实验(Java中的IO流操作)
  • python脚本下载ERA5数据详细规范和教程
  • Mysql中索引的知识
  • c#栈及其应用
  • 生物信息学常用软件InSequence,3大核心功能,简易好上手
  • PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)之扩展
  • Redis Sentinel 和 Redis Cluster 各自的原理、优缺点及适用场景是什么?
  • pStubMsg--MemorySize0x74字节是如何分配的之rpcrt4!NdrAllocate函数分析
  • 项目三 - 任务1:采用面向对象方式求三角形面积
  • 大模型落地难题:如何用LoRA低成本微调企业私有模型?
  • 信道估计--最小均方误差(MMSE)
  • 解锁植被参数反演密码:AI 与 Python 的融合之道
  • 深入理解过拟合:机器学习中的常见陷阱
  • 软考高项(信息系统项目管理师)第 4 版全章节核心考点解析(力扬老师课程精华版)
  • qtfaststart使用教程(moov置前)