跨域解决方案

浏览器的同源策略

浏览器为确保资源安全,而遵循的一种策略。

什么是源?

源 = 协议 + 域名 + 端口号。

示例(同源):

  • https://example.comhttps://example.com/page2

❌ 示例(非同源):

  • http://example.comhttps://example.com(协议不同)
  • https://example.comhttps://api.example.com(域名不同)
  • https://example.com:80https://example.com:443(端口不同)

什么是跨域?

所处源与目标源不一致,就是非同源,又称跨域

浏览器会对跨域做出哪些限制?

例如:源 A 和源 B 是非同源的,则浏览器会有如下限制:

  1. DOM访问限制:源A的脚本不能读取和操作源B的DOM。
    <body>
        <button onclick="showDOM()">获取页面2的DOM</button>
        <iframe id="framePage" src="http://www.baidu.com"></iframe>
        <script type="text/javascript" >
            function showDOM(){
                const framePage = document.getElementById('framePage')
                console.log(framePage.contentWindow) //可以拿到window
                console.log(framePage.contentWindow.document) //不可以拿到DOM
            }
        </script>
    </body>
  1. Cookie的访问限制:源A不能访问源B的Cookie
    <body>
        <button onclick="showCookie()">获取页面2的Cookie(不会成功的)</button>
        <iframe id="framePage" src="http://www.baidu.com"></iframe>
        <script type="text/javascript" >
            function showCookie(){
                 console.log(document.cookie) //打印的是当前源的cookie
            }
        </script>
    </body>
  1. Ajax相应数据限制:源A可以给源B发请求,但是无法获取源B响应的数据
<body>
        <button onclick="getNews()">获取头条新闻</button>
        <script type="text/javascript" >
            async function getNews(){
                const url = "https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc"
                let result = await fetch(url)
                let data = await result.json()
                console.log(data)
            }
        </script>
    </body>
  1. 跨域限制仅存在浏览器端,服务端不存在跨域限制。
  2. 即使跨域了Ajax请求也可以正常发出,但响应数据不会交给开发者。
    截屏2026-01-12 15.53
    3.<lilnk>、<script>、<img>等这些标签发送的请求也可能跨域,只不过浏览器对标签跨域不做严格限制,对开发几乎无影响。

CORS概述

截屏2026-01-12 20.51.07

CORS解决简单跨域问题

截屏2026-01-12 21.08.15

简单请求与复杂请求

CORS会把请求分为两类,分别是1.简单请求 2.复杂请求
截屏2026-01-12 21.13.52

预检请求

截屏2026-01-12 21.23.39
截屏2026-01-12 21.29.17

借助cors库快速完成配置

  • 安装cors
npm i cors
  • 简单配置cors
app.use(cors())
  • 完整配置cors
    截屏2026-01-12 21.42.16

视频来源:https://www.bilibili.com/video/BV1pT421k7yz/?spm_id_from=333.337.search-card.all.click&vd_source=340c4ed1715acfc7655ec3e2ff23b3b7 | 作者:@尚硅谷 |

posted @ 2026-01-12 21:49  米浆  阅读(2)  评论(0)    收藏  举报