前端 跨域解决方案

一、什么是跨域?

协议、域名、端口 三者有任意一个不一样 ,就是跨域。

浏览器出于安全考虑,会限制跨域请求,这就是同源策略(Same-Origin Policy)

举例:

复制代码
https://www.baidu.com
  • 协议:https
  • 域名:www.baidu.com
  • 端口:443(默认省略)

只要一个不同,就是跨域:

  • http://baidu.com → 协议不同
  • https://map.baidu.com → 子域名不同
  • https://baidu.com:8080 → 端口不同

二、为什么要有跨域限制?

核心目的:防止 CSRF 攻击、窃取 Cookie、窃取用户信息

如果没有同源限制,恶意网站可以随便请求你的银行接口、拿你的登录态。

三、前端常见跨域解决方案

1. CORS(最常用、最标准)

Cross-Origin Resource Sharing,跨域资源共享。由后端在响应头里声明 "允许哪些域名跨域",浏览器遵守规则放行。

  1. 核心原理

跨域请求能发到后端,但浏览器会检查响应头:

  • 有 CORS 头 → 给前端数据
  • 没有 → 拦截,前端拿不到结果

后端在响应头里加允许跨域的字段,浏览器识别后放行。

关键响应头:

  • Access-Control-Allow-Origin: * 或指定域名
  • Access-Control-Allow-Methods: GET,POST,PUT...
  • Access-Control-Allow-Headers: Content-Type...
  • Access-Control-Allow-Credentials: true 允许带 Cookie

特点:

  • 简单请求直接跨域
  • 复杂请求先发 OPTIONS 预检请求

2. JSONP(老方案,只支持 GET)

利用 <script> 标签不受跨域限制的特点。

流程:

  1. 前端定义一个全局函数 fn
  2. 动态创建 <script src="http://xxx?callback=fn">
  3. 后端返回 fn(数据)
  4. 浏览器执行 fn,拿到数据

缺点:只 GET、不安全、不支持 POST。


3. 代理服务器(开发最常用)

前端请求自己的服务器 → 服务器转发请求到目标跨域接口

服务器之间没有跨域限制。

常见:

  • webpack devServer proxy
  • vite proxy
  • Nginx 反向代理

4. Nginx 反向代理(生产常用)

配置 Nginx,把接口路径转发到目标服务器,浏览器看起来是同域。


5. postMessage(iframe 跨域)

页面与内嵌 iframe 之间跨域通信。


6. WebSocket

不受同源策略限制。


7. document.domain(仅限同一主域名不同子域)

比如 a.xxx.comb.xxx.com

设置 document.domain = 'xxx.com' 即可跨域。


四、面试高频问答

1. 什么是简单请求、复杂请求?

简单请求

  • 方法:GET/HEAD/POST
  • 请求头只有:Accept、Accept-Language、Content-Language、Content-Type(仅 form-data、urlencoded、text/plain)

复杂请求

  • PUT/DELETE
  • 自定义头
  • Content-Type: application/json

会先发一次 OPTIONS 预检请求,确认允许跨域才发真实请求。

2. 跨域时为什么能发出去但浏览器拦截?

请求确实发到后端了,后端也返回了。

但浏览器检查响应头没有 CORS 字段,浏览器自己拦截,不给前端数据。

  • 前端:withCredentials: true
  • 后端:Access-Control-Allow-Credentials: true
  • Allow-Origin 不能为 *,必须写具体域名

4. 最优跨域方案是什么?

  • 开发环境:代理(proxy)
  • 生产环境:CORS / Nginx 反向代理

五、一句话总结

跨域是浏览器同源策略 导致的限制;

解决核心是后端允许(CORS)绕开浏览器(代理/JSONP)

现代项目首选 CORS + 代理

相关推荐
LinXunFeng7 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg11 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭11 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒11 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭12 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
Hyyy13 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin13 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic13 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶14 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
爱勇宝14 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员