副队长JavaScript教程(70)-Ajax同源策略与跨域

点此查看 所有教程、项目、源码导航

文章目录

  • [1. 什么是同源](#1. 什么是同源)
    • [1.1 同源三要素](#1.1 同源三要素)
    • [1.2 容易踩坑的例子](#1.2 容易踩坑的例子)
  • [2. 同源策略](#2. 同源策略)
    • [2.1 同源策略概念](#2.1 同源策略概念)
    • [2.2 浏览器为什么要有同源策略?](#2.2 浏览器为什么要有同源策略?)
  • [3. 什么是跨域](#3. 什么是跨域)
  • [4. 怎么解决跨域(前端视角)](#4. 怎么解决跨域(前端视角))
    • [4.1 CORS(跨域资源共享)](#4.1 CORS(跨域资源共享))
    • [4.2 其他方案(简单了解)](#4.2 其他方案(简单了解))
  • [5. 我们之前遇到的跨域场景复盘](#5. 我们之前遇到的跨域场景复盘)
  • [6. 小结](#6. 小结)

前面我们已经学会使用 XHR 发送网络请求,很多同学在测试的时候,会遇到控制台报跨域错误。这一篇我们就搞懂:什么是同源、什么是跨域、为什么浏览器要限制跨域。

1. 什么是同源

同源,要求两个地址 协议、域名、端口 这三部分全部一样,才叫同源。

只要其中任意一个不一样,就是不同源。

1.1 同源三要素

  1. 协议:http、https
  2. 域名:localhost、127.0.0.1、jsonplaceholder.typicode.com
  3. 端口:5500、8080、3000

举例:

页面地址:http://127.0.0.1:5500/index.html

接口地址:http://127.0.0.1:5500/api/list

✅ 协议、域名、端口全都相同 → 同源

页面地址:http://127.0.0.1:5500/index.html

接口地址:https://jsonplaceholder.typicode.com/posts

❌ 域名不一样 → 不同源,触发跨域

1.2 容易踩坑的例子

  • http 和 https:不同协议 → 跨域
  • 127.0.0.1 和 localhost:域名不一样 → 跨域
  • 端口 5500 和 8080:端口不同 → 跨域

2. 同源策略

2.1 同源策略概念

同源策略是浏览器的安全规则 ,是浏览器自带的保护机制,不是 JS 语法的限制。

规则:

同源策略允许网页去请求同源的接口;默认不允许网页直接访问不同源的接口。

2.2 浏览器为什么要有同源策略?

核心目的:保护用户安全,防止恶意网站窃取数据。

举个例子:

你登录了银行网站,浏览器里面保存了你的登录状态。如果没有同源限制,一个恶意网页就可以偷偷发起请求,去银行接口读取你的余额、转账,风险极大。

同源策略就是用来隔离不同网站,防止恶意网站随便读取别的网站数据。

重点:同源策略只存在浏览器里面。

后端和后端之间、后端去请求别的接口,不存在跨域限制。

3. 什么是跨域

跨域 = 不同源。

当页面地址和接口地址协议 / 域名 / 端口任意一项不一致,浏览器的同源策略就会拦截这次请求,控制台报跨域错误。

⚠️ 重要区分:

跨域不是请求发不出去,很多时候请求已经到达后端,后端也收到并且处理了,只是浏览器拿到返回结果之后,不给前端 JS 读取,直接拦截响应。

4. 怎么解决跨域(前端视角)

跨域是浏览器的安全限制,单纯靠前端 JS 代码不能解决跨域 。

最主流、标准方案:后端开启 CORS(跨域资源共享)。

所以这篇文章,前端人员了解就行,一般都是后端开发人员实现跨域。

4.1 CORS(跨域资源共享)

后端在响应头里面添加允许跨域的配置,告诉浏览器:这个接口允许来自别的源的页面访问。

浏览器看到这个响应头,就会放行,不再拦截。

像我们之前用的 jsonplaceholder 测试接口,就是后端配置好了 CORS,所以我们 打开页面可以正常请求。

补充:SpringBoot 后端可以简单配置开启 CORS,这个是后端开发的工作,前端不用写额外代码。

4.2 其他方案(简单了解)

  1. 代理服务器:开发环境常用,vite、webpack 代理,属于开发工具层面方案
  2. JSONP:只支持 GET 请求,不支持 POST,老旧方案,现在基本不用

一句话总结给学生:跨域主要是后端通过 CORS 解决,前端不用写特殊请求代码。

5. 我们之前遇到的跨域场景复盘

场景 1:直接双击打开 html,地址是 file:// 协议

去请求 https 的接口,协议不一样,跨域。

场景 2:本地页面 http://127.0.0.1:5500 请求网上的测试接口

域名不一样,本来就是跨域,但是接口后端开了 CORS,所以可以正常拿到数据。

场景 3:自己写的 SpringBoot 接口,没有配置 CORS

前端请求直接跨域报错,需要后端加上跨域配置。

6. 小结

  1. 同源看三样:协议、域名、端口,全部相同才是同源;
  2. 同源策略是浏览器的安全机制,用来保护用户数据;
  3. 三要素任意一个不同,就是跨域;跨域是浏览器拦截响应,不是请求发不出去;
  4. 跨域标准解决方案:后端配置 CORS;前端代码不需要改动;
  5. 后端之间通信不受同源策略限制。
相关推荐
普通人61 小时前
Web端3D模型加载实战指南_Vue3_uni-app_HTML
前端·javascript·uni-app·html
志尊宝1 小时前
AI原生前端开发(042):AI辅助的路由设计与优化
javascript·react.js·ai-native
Dxy123931021612 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷12 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
椒哥15 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
kyriewen15 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
OpsEye16 小时前
企业大模型压测,需要重点关注哪些指标?
javascript·ai编程
像我这样帅的人丶你还17 小时前
我html生成的doc文档为何在手机文档显示不了图片?
前端·javascript
栉甜20 小时前
Vue2学习内容(上)
前端·javascript·vue.js·学习