zoukankan      html  css  js  c++  java
  • 前端跨域几种方式

    跨域问题的直接原因是浏览器存在同源策略,浏览器同源指的是:两个页面的协议、端口和主机相同,则两个页面具有相同的源。IE下满足协议、主机相同,就认为是同源。

    想象一下,如果没有同源策略,谁都可以修改你站点上的内容,读取你的cookie,后果难以想象

    前端跨域的几种方式

    修改document.domain

    document.domain 用来获取当前网页的域名,document.domain可以被赋值

    document.domain只能修改成当前域名的主域名或者基础域名,如当前域名是b.360.cn,那么document.domain只能改成主域名www.360.cn或者基础域名360.cn,改为其它值会提示“参数无效”

    如 a.360.cn/x.html 和 b.360.cn/y.html 都将document.domain 改为360.cn 后,两个页面就可以跨域通信了

    前提条件:两个域名必须属于同一个基础域名且协议端口一致

    隐患:当a.360.cn 遭到攻击后,b.360.cn会有安全隐患

    动态创建script

    script 不受同源策略限制,在a.360.cn页面中引入b.360.cn的js文件,就可以操作a.360.cn下的cookie、DOM等

    通过location.hash传参

    a、b、c三个页面,a、c页面同源,b是需要跨域的页面,a页面创建一个iframe指向b页面,b页面根据parent.location.hash 的值去做相应的操作,操作完成后修改parent.location.hash 的值告诉a,a监听自己的hash变化,IE、chrome下,b页面无法直接修改parent.location.hash,需要借助与a同源的c页面,具体做法是,b页面创建iframe指向c页面,b页面改变自己的hash,c页面读取b页面的parent.location.hash去修改a页面的hash,a、c页面同源,c页面可以修改a页面的hash,即parent.parent.location.hash

    通过window.name传参

    a、b、c三个页面,a、c页面同源,b是需要跨域的页面,a页面创建iframe指向b页面,b页面将数据赋值给window.name,接着修改iframe的src指向c页面,a、c页面同源,参考document.domain方法取得c页面window.name的值,为了安全,获取数据后销毁iframe

    POSTMessage

    a、b两个页面分别属于http://a.360.cn和http://b.360.cn,两个页面通信

    // a.360.cn/a.html内容
    <iframe id="iFr" src="b.360.cn/b.html"></iframe>
    var iFrame = document.getElementById('iFr');
    var targetOrigin = 'http://b.360.cn/b.html';
    
    iFrame.contentWindow.postMessage('message from http://a.360.cn', targetOrigin);
    
    // b.360.cn/b.html内容
    window.addEventListener('message', function(event){
        // 安全起见,必须验证消息来源
        if(event.origin === 'http://a.360.cn'){
            alert(event.data); // 'message from http://a.360.cn'
        }
    })

    JSONP

    动态创建script标签加载数据,前端将回调函数名传给服务端,服务端返回回调函数,函数参数是请求过来的数据,将返回值插入页面会自动执行

    1)安全问题

    2)要确定jsonp请求是否成功并不容易

  • 相关阅读:
    【2020省选Day1T1】LOJ3299 「联合省选 2020 A | B」冰火战士
    题解 CF1369 D,E,F Codeforces Round #652 (Div. 2)
    题解 LOJ3298 「BJOI2020」封印(SAM,数据结构)
    题解 nflsoj99 牛顿的烈焰激光剑(容斥,DP,数学)
    判断长度为3的等差数列(经典问题)
    树形图求和:一道经典矩阵知识题
    题解 LOJ2390 「JOISC 2017 Day 1」开荒者
    istio sidecar自动注入过程分析
    filebeat-kafka日志收集
    istio路由配置
  • 原文地址:https://www.cnblogs.com/wangmeijian/p/6673933.html
Copyright © 2011-2022 走看看