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

前端跨域以及解决方案

什么是跨域?

跨域指的是浏览器出于安全考虑,实施了同源策略。它限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互。

同源策略规定:如果两个 URL 的协议(Protocol)、域名(Host)、端口(Port) 完全一致,则这两个 URL 是同源的。

只要其中任何一项不一致,就是跨域(或称不同源)。浏览器会对这种跨域的请求或交互进行限制。

举个例子:

| 当前页面URL | 请求的URL | 是否同源 | 原因 |
| :— | :— | :—: | :— |
| https://www.example.com/index.html | https://www.example.com/api/user | | 协议、域名、端口完全相同 |
| https://www.example.com/index.html | http://www.example.com/api/user | | 协议不同(HTTPS vs HTTP) |
| https://www.example.com/index.html | https://api.example.com/user | | 域名不同(www vs api) |
| https://www.example.com:8080/index.html | https://www.example.com:443/api/user | | 端口不同(8080 vs 443) |

常见的跨域场景表现:

  • 前端域名 www.abc.com,调用后端接口 api.abc.com
  • 本地开发 localhost:3000,请求后端服务器 localhost:8000
  • 前端部署在 http 协议下,请求 https 的接口。

常见的解决方案有哪些?

解决跨域的本质是“绕过”浏览器的同源策略限制。以下是几种主流且常用的方案,我会从最推荐的开始说起。

1. CORS(跨域资源共享) - 最主流、最推荐

这是 W3C 标准,属于跨域 Ajax 请求的根本解决方案。它需要后端服务器在响应头中设置特定的字段来告诉浏览器允许某个源进行跨域访问。

  • 简单请求:不会触发预检请求。服务器需要设置:
    Access-Control-Allow-Origin: https://www.example.com // 或 ‘*‘(允许任何源)
    
  • 非简单请求(如使用了 PUT、DELETE 或自定义头):会先发送一个 OPTIONS 预检请求。服务器需要处理这个预检请求并返回:
    Access-Control-Allow-Origin: https://www.example.com
    Access-Control-Allow-Methods: GET, POST, PUT // 允许的方法
    Access-Control-Allow-Headers: Content-Type, Authorization // 允许的头部
    

优点:安全、规范,是官方标准。
缺点:需要后端配合支持。

2. 反向代理(开发阶段常用)

开发环境下,前端开发服务器(如 Webpack-dev-server, Vite)本身就提供了代理功能。其原理是:让同源的服务器去代理请求不同源的接口

因为同源策略是浏览器的限制,服务器之间通信没有这个限制。

  • 配置示例(Vite):
    // vite.config.js
    export default {server: {proxy: {'/api': { // 以 '/api' 开头的请求被代理target: 'http://localhost:8000', // 后端服务器地址changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '') // 重写路径(可选)}}}
    }
    
    这样,前端请求 /api/users 会被开发服务器代理到 http://localhost:8000/users

优点:前端开发无感知,无需后端修改 CORS 配置,非常适合开发调试。
缺点:生产环境部署时需要配合 Nginx 等服务器做同样配置。

3. JSONP(已逐渐淘汰)

利用 <script> 标签没有跨域限制的特点来实现的。它只能用于 GET 请求。

  • 步骤
    1. 前端定义一个全局回调函数,例如 handleResponse
    2. 动态创建一个 script 标签,其 src 指向请求的地址并带上回调函数名,如 https://api.example.com/data?callback=handleResponse
    3. 后端接收请求后,返回一段 JavaScript 代码,代码内容是调用这个回调函数并传入数据:handleResponse({...data...})
    4. 浏览器接收到响应后执行这段代码,前端定义的回调函数就会被调用并接收到数据。

优点:兼容性极好,支持老版本浏览器。
缺点:只支持 GET 方法,安全性差,容易遭受 XSS 攻击。现在基本已被 CORS 取代。

4. 其他方案(了解即可)
  • WebSocket:WebSocket 协议本身允许跨域通信。
  • postMessage:用于不同窗口(如 iframe、弹窗)之间的跨域通信,例如页面与内嵌 iframe 之间的消息传递。
  • Nginx 反向代理:与开发环境代理原理相同,在生产环境中通过 Nginx 配置代理路径,将特定请求转发到真实的后端服务器。
    location /api/ {proxy_pass http://backend-server.com:8000/;
    }
    
  • 修改浏览器启动参数(仅测试用):启动 Chrome 时加上 --disable-web-security 参数来完全禁用同源策略(极度不安全,严禁在生产或开发中使用,仅用于临时测试)。

总结与面试回答建议

在面试中,你可以这样总结:

“跨域是由于浏览器的同源策略导致的安全限制。目前最主流和推荐的解决方案是 CORS,它需要后端配合设置响应头。在开发阶段,我们通常会使用反向代理(如 Webpack 或 Vite 的 proxy 配置)来无缝解决这个问题,因为这样前端代码无需任何改动。对于一些历史项目或特殊场景,可能会用到 JSONP,但它只支持 GET 且不安全,现在已不常用了。”

这样的回答表明你:

  1. 理解原理:清楚地解释了同源策略。
  2. 掌握方案:列出了多种解决方案并知道其优缺点。
  3. 具备工程化能力:知道在开发和生产环境下如何选择最合适的方案(开发用代理,生产用 CORS 或 Nginx)。
  4. 了解技术演进:知道 JSONP 的衰落和 CORS 的兴起。

文章转载自:

http://inuTGfSk.wmfmj.cn
http://c1QEWaiT.wmfmj.cn
http://dOGNydl6.wmfmj.cn
http://KIAIkv5I.wmfmj.cn
http://M7Fn3JN9.wmfmj.cn
http://JzY8EAxr.wmfmj.cn
http://JaxNDUYA.wmfmj.cn
http://TByjUgWM.wmfmj.cn
http://vujHv4Ay.wmfmj.cn
http://XmCWy88n.wmfmj.cn
http://aPe8nduZ.wmfmj.cn
http://ZOiZxOxw.wmfmj.cn
http://Y9m2C9c4.wmfmj.cn
http://hbQv4jQL.wmfmj.cn
http://LJhcqLjZ.wmfmj.cn
http://wSmYECEz.wmfmj.cn
http://DonqerEV.wmfmj.cn
http://vc4I9LlI.wmfmj.cn
http://ISGOVPPE.wmfmj.cn
http://I7jU0WQ2.wmfmj.cn
http://N9Hs8EHf.wmfmj.cn
http://4GHwpSJw.wmfmj.cn
http://p3BDqEoD.wmfmj.cn
http://YU11rx74.wmfmj.cn
http://tgDuWClz.wmfmj.cn
http://BfcSlPq1.wmfmj.cn
http://LYR5ecTW.wmfmj.cn
http://BMsYyjHe.wmfmj.cn
http://4Wax1Y9j.wmfmj.cn
http://YfSLMvvm.wmfmj.cn
http://www.dtcms.com/a/380401.html

相关文章:

  • 深度理解P-R曲线和ROC曲线
  • secp256k1 椭圆曲线密码学算法
  • 四大经典案例,入门AI算法应用,含分类、回归与特征工程|2025人工智能实训季初阶赛
  • 两种常用的抗单粒子翻转动态刷新方法
  • 【FPGA开发工具】HLS中AXI4-Stream接口的使用
  • 头条号矩阵运营经验访谈记录
  • LeetCode 378 - 有序矩阵中第 K 小的元素
  • LeetCode算法日记 - Day 39: 在每个数行中找最大值、最后一块石头的重量
  • “能量逆流泵”:一种基于电容阵与开关矩阵的超高效大功率降压架构
  • 软件无线电-AD9361 璞致 PZSDR 软件无线电系列板卡之PZ-FL9361(FMCOMMS3)使用说明
  • Logseq+cpolar:让开源笔记效率翻倍
  • 国产操作系统之鸿蒙操作系统(PC端)的安装与使用
  • 【学习】vue监听属性
  • 把多个 PPT 合并在一起,三步告别复制粘贴
  • 最终的信号类
  • 技术为景,架构为用:论存储过程+JSON范式在企业级系统中的理性回归
  • Bug排查日记
  • 混沌工程——终止开关(Kill Switch)
  • A股大盘数据-20250912分析
  • 花漾TK更新:邀约管理、花漾TK插件大幅增强等(20250905)
  • Android,Jetpack Compose,坦克大战游戏案例Demo
  • 接口测试面试题
  • PDF转Word在线转换教程:多种实用方法分享
  • 【代码随想录算法训练营——Day10】栈与队列——232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项
  • 【Luogu】P2613 【模板】有理数取余
  • 第一部分:服务器硬件配置
  • 【前端】JavaScript--浅拷贝与深拷贝
  • pureadmin的动态路由和静态路由
  • 24年秋招-京东-后端开发岗-第1批笔试总结
  • 技术与情感交织的一生 (十三)