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

一文带你理清同源和跨域

off999 2025-02-07 18:43 34 浏览 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

    借助

    相关推荐

    360极速浏览器手机版(360极速浏览器手机版下载)

    chrome.360.cn360极速浏览器是国内高端用户首选的浏览器。360极速浏览器在保证安全和稳定的基础上把“极速”做到极致,启动快,打开网页快。同时它界面简洁精致,还支持通过壁纸实现整体换肤,换...

    悟饭模拟器(悟饭模拟器下载)

    街机模拟器里,说比悟饭游戏厅更好的,用起来都没有悟饭游戏厅好。之前听了别人的用了别的,结果用起来还是悟饭游戏厅更好,不说别的,界面绝对是模拟器中最好看的,游戏资源也不少,对比界面其他的一看就像是山寨一...

    手机ps软件中文版(手机ps简体中文版)

    在手机版Photoshop中,您可以通过以下步骤将其语言从英文更改为中文:1.打开Photoshop应用程序并进入设置:从主界面打开Photoshop应用程序,然后点击“设置”图标。2.进入语言设...

    手机桌面软件(手机桌面软件不见了怎样恢复)
    • 手机桌面软件(手机桌面软件不见了怎样恢复)
    • 手机桌面软件(手机桌面软件不见了怎样恢复)
    • 手机桌面软件(手机桌面软件不见了怎样恢复)
    • 手机桌面软件(手机桌面软件不见了怎样恢复)
    口袋妖怪复刻官网下载(口袋妖怪复刻官网下载安装)

    要在3ds上下载口袋妖怪始源红宝石721版本,您需要按照以下步骤进行操作:1.打开3dsMax或SketchUp软件,并创建一个新的项目。2.打开游戏文件所在的文件夹,找到“红宝石721.mds...

    win7升级win10还免费吗(win7升级win10系统版本要钱吗)

     中国移动送七天10g免费流量哪里领取?如果你是在网上看到这种广告的话,你可以直接点击那个链接进去选择订阅,然后呢,如果订阅成功了,那平台就会直接给你发放这个流量,如果你是在实体店看到的这个...

    photoshop下载安装教程(ps下载安装教程视频)

    1.下载安装并激活Photoshop需要一定的步骤和技巧,但是只要按照正确的方法进行,就可以成功完成。2.首先需要从Adobe官网下载Photoshop的安装程序,然后按照提示进行安装。安装完成后...

    防火墙软件下载(360防火墙app下载)

    如果你的刚下载的软件被防火墙阻止了,你可以尝试以下方法解决问题。首先,确保你的防火墙设置允许该软件的访问权限。你可以在防火墙设置中找到应用程序列表,然后添加该软件到允许访问的列表中。如果你不确定如何进...

    51漫画app下载安装在线观看(51漫画app下载安装免费下)

    51动漫的登录账号,需要先在51动漫官方网站进行注册。注册完成后,便可用该账号在51动漫客户端进行登录。具体登录步骤是:打开51动漫客户端,点击右上角头像进行登录,在弹出的登录页面中输入注册时使用的账...

    冒险岛手游官网下载(冒险岛手游 百度百科)

    要下载冒险岛的官方游戏,请按照以下步骤操作:首先,打开您的网络浏览器,然后在搜索引擎中输入“冒险岛官网”。点击搜索结果中的官方网站链接,进入官方网站。在网站上,寻找游戏下载页面或下载按钮。点击下载按钮...

    雨水情测报系统(雨水情测报系统验收)

    为加强防汛管理,规范水雨情测报工作,明确水雨情测报条件、测报频次、记录报送等基本要求。适用于总库容10万立方米以上、1000万立方米以下小型水库水雨情测报工作。应具备必要的水情、雨情观测设施,也可利用...

    软件应用商店大全(应用商店软件下载排行榜)

    360手机助手是android智能手机的手机管理专家。提供海量的游戏、软件、音乐、小说、视频、图片,通过它轻松下载、安装、管理手机资源。所有提供信息资源,全部经过360安全检测中心的审核认证,绿色无毒...

    下书网电子书下载网站(下书网免费下载小说)

    存放在我的书架里,可以查看

    cad怎么下载(cad怎么下载到电脑上)

    1、在搜索引擎中输入cad安装包并点击搜索,选择一款安装包进行下载。2、将下载的cad安装包解压出来,右键点击解压文件,在解压出来的文件里面找到setup安装程序,双击开始安装。3、点击开始安装,勾选...

    ps教程免费视频教程全集(ps教程视频全集观看)

    Photoshop自带的教程关了以后怎么找到首先我们打开Photoshop,在最上面的工具栏中找到窗口。点击窗口,在下面找到“学习”工具。然后点击,教程就会出现啦。Photoshop自带的教程关了以后...

    取消回复欢迎 发表评论: