百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

一文带你理清同源和跨域

off999 2025-02-07 18:43 39 浏览 0 评论

1、概述

前后端数据交互经常会碰到请求跨域,什么是跨域,为什么需要跨域,以及常用有哪几种跨域方式,这是本文要探讨的内容。

同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

同源策略是一种约定,它是浏览器最核心也是最基本的安全功能。出于安全考虑,浏览器限制从JS脚本发起的跨源HTTP请求。

通俗的理解:浏览器规定,A 网站的 JavaScript,不允许和非同源的网站 C 之间,进行资源的交互,例如:

①无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB。

②无法接触非同源网页的 DOM。

③无法向非同源地址发送 Ajax 请求。

同源指的是两个 URL 的协议、域名、端口一致,反之,则是跨域。出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。

例如网页(
http://www.test.com/index.html)和接口(
http://www.api.com/userlist),非同源的URL,浏览器允许发起跨域请求,但是,跨域请求回来的数据,会被浏览器拦截,无法被页面获取到。

2、为什么要跨域?

跨域是浏览器受同源(协议、域名、端口)策略的限制,不允许不同源的站点之间进行某些操作(如发送ajax请求,操作dom,读取cookie),如果不进行特殊配置是不能操作成功的,并且控制台会报如下跨域错误:

`No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'xxxxxx' is therefore not allowed access

跨域的根本原因是浏览器的“同源策略”,同源 就是【协议+域名+端口号】相同,即为同源,只能向同源的服务发起AJAX请求。

源1

源2

是否同源

a.com

b.com

不同源,域名不同

http://a.com

https://a.com

不同源,协议不同

a.com:80

a.com:443

不同源,端口不同

gg.com

a.gg.com

不同源,子域名不同

a.com/ss

a.com/s2

同源

可通过location.originwindow.origin获取当前文档的源

为什么要同源呢?

这是浏览器故意设计的,是浏览器的基本安全策略,否则会很容易受到XSS、CSRF攻击。只能向同源的服务发起AJAX请求,不可跨域请求,会被浏览器拦截。

有哪些限制规则呢?

  • ? 访问其他源的图片、CSS、JS是可以的,允许

    JSONP的实现:

    function jsonp(url, args, cbName) {
      return new Promise((resolve, reject) => {
        const ele = document.createElement('script');
        window[cbName] = (data) => {
          resolve(data);
          document.body.removeChild(ele);
        }
        args = { ...args, callback: cbName };
        ele.src = `${url}?${Object.keys(args).map(k => `${k}=${args[k]}`).join('&')}`;
        document.body.appendChild(ele);
      });
    }
    //使用,api为360的公开接口
    jsonp('https://sug.so.360.cn/suggest', { format: 'jsonp', word: 'china' }, 'search')
      .then(function (data) {
        console.log(data)
      });

    3.2、CORS跨域

    CORS是什么?—— 跨域资源共享 (cross-origin resource sharing),让AJAX可以跨域访问数据。这是为了满足跨域请求的需求,W3C新增加的特性,需要服务端的支持,不支持IE8/9。

    当浏览器发送一个跨域请求时,它会首先发送一个预检请求(OPTIONS请求),检查后端是否支持跨域请求。这个预检请求会包含一些CORS相关的HTTP头,如Origin、
    Access-Control-Request-Method和
    Access-Control-Request-Headers。后端收到预检请求后,会检查请求中的Origin头,与自己在CORS配置中设置的allowedOrigins进行对比,如果匹配成功,就会在响应中设置相应的CORS头,如
    Access-Control-Allow-Origin、
    Access-Control-Allow-Methods和
    Access-Control-Allow-Headers等。

    一旦预检请求通过,浏览器就会发送实际的跨域请求。在接收到实际请求的响应后,浏览器会再次检查响应中的CORS头,确保它们与预检请求中的设置一致。如果一切正常,浏览器就会允许前端JavaScript代码访问响应中的数据。

    通过这种方式,后端通过显式配置CORS参数,告知浏览器哪些源有权访问其资源,从而实现了跨域访问的功能。这既保证了安全性(只允许指定的源进行访问),又提供了灵活性(可以根据需要配置不同的CORS策略)。

    根据请求方式,浏览器将CORS分为两种情况:

    • 简单请求(安全请求):只支持GET、POST、HEAD,Header只支持部分字段。
    • 复杂请求(其他请求):简单请求以外的其他跨域请求。

    简单请求

    基本原理就是在请求头加入一个身份来源标识,服务端根据这个标识来判等是否允许访问,如果允许则给一个允许的标记并返回响应。

    • 只支持GET、POST、HEAD。
    • header —— 我们仅能设置基础的安全字段:
      • Accept
      • Accept-Language
      • Content-Language
      • Content-Type 的值为 application/x-www-form-urlencoded,multipart/form-data 或 text/plain。

    具体过程比较简单,前端只要在Header加入“Origin”即可:

    • 请求头Header加入要跨域的源:origin:http://www.main.com
    GET /api HTTP/1.1
    Origin: http://www.main.com             //本次请求来自哪个源
    Host: http://www.third.com              //请求的第三方API
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0
    ...
    • 服务端收到请求后检查Origin,如果同意请求则正常响应,同时在响应的Header中加入特殊的“Access-Control-Allow-Origin”字段,申明支持的源,也可以用“*”表示支持任何源访问。
    • 浏览器收到响应后会检查“Access-Control-Allow-Origin”,和当前源对比,如果不合法则会报错——跨域。
    Access-Control-Allow-Origin: http://www.main.com        //请求允许的源
    Access-Control-Allow-Credentials: true                          //是否允许cookie,cors默认不发送cookie,如果要发送,还需AJAX中设置withCredentials
    Access-Control-Expose-Headers: Content-Length,API-Key   //如果客户端想要访问其他非安全字段,则需要服务端明确定义哪些Header字段暴露出来
    Content-Type: text/html; charset=utf-8

    复杂请求

    不是简单请求的都称为复杂请求(非简单请求),如请求方法是PUT、DELETE,或Content-Type=application/json。相比于简单请求,复杂请求多了一次预请求。

    预请求

    • 正式发送请求前,浏览器会自动发送一个预请求,问问服务端是否允许本次请求,如果回应允许才正式发送请求,后面就和简单请求相同了。
    • 预请求及其响应都没有body,采用OPTIONS方法。

    JSONP 与`CORS 的对比

    JSONP 是很早很成熟的解决方案,但是,只能进行 GET 请求,无法实现上传数据等操作。

    反观:CORS 虽然分 预请求非预请求 ,但是,无疑支持的功能是非常强大的 !!!

    3.3、Nginx反向代理

    跨域是浏览器的保护机制,如果绕过浏览器,使用代理服务器去请求目标服务器上的数据,就不会受跨域影响。因此前端可以通过脚手架或webpack配置devSever下的proxy选项,将/api开头的请求转发到真实服务器上。

    在生产环境下也可以使用nginx配置反向代理来解决跨域。

    Nginx 则是通过反向代理的方式,(这里也需要自定义一个域名)这里就是保证我当前域,能获取到静态资源和接口,不关心是怎么获取的。

    配置下 hosts

    127.0.0.1 local.test

    配置 nginx

    server {
            listen 80;
            server_name local.test;
            location /api {
                proxy_pass http://localhost:8080;
            }
            location / {
                proxy_pass http://localhost:8000;
            }
    }

    对于前端开发而言,大部分的跨域问题,都是通过代理解决的

    代理适用的场景是:生产环境不发生跨域,但开发环境发生跨域

    4、小结

    因为同源是浏览器的限制,跨域的方法无非就是绕过,或采用CORS。

    跨域方案

    基本原理

    是否需要服务端支持

    JSONP

    借助

    相关推荐

    安全教育登录入口平台(安全教育登录入口平台官网)

    122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

    大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

    大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

    谷歌地球下载高清卫星地图(谷歌地球地图下载器)
    • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
    • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
    • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
    • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
    哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
    哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

    要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

    2026-02-04 09:03 off999

    电信宽带测速官网入口(电信宽带测速官网入口app)

    这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

    植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

    1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

    免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

    1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

    2025世界杯赛程表(2025世界杯在哪个国家)

    2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

    下载搜狐视频电视剧(搜狐电视剧下载安装)

    搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

    pubg免费下载入口(pubg下载入口官方正版)
    • pubg免费下载入口(pubg下载入口官方正版)
    • pubg免费下载入口(pubg下载入口官方正版)
    • pubg免费下载入口(pubg下载入口官方正版)
    • pubg免费下载入口(pubg下载入口官方正版)
    永久免费听歌网站(丫丫音乐网)

    可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

    音乐格式转换mp3软件(音乐格式转换器免费版)

    有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

    电子书txt下载(免费的最全的小说阅读器)

    1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

    最好免费观看高清电影(播放免费的最好看的电影)

    在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

    孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

    要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

    取消回复欢迎 发表评论: