跨域解决方案

一、什么是跨域

跨域,是指浏览器不能执行其它网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

同源策略会限制以下行为:

a、Cookie、LocalStorage和IndexDB无法读取;

b、DOM和JS对象无法获取;

c、Ajax请求发送不出去;


二、常见的跨域场景

同源策略是指,域名、协议、端口均为相同。

 

三、跨域的解决方法

1.jsonp跨域(仅支持get)

原理:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。script标签只支持GET请求,所以JSONP也只支持GET的请求方法。

方式:

    a、可以使用原生方法,createElement('script')一个script标签。然后为这个script的src赋值。然后appendChild到body上(可在链接上携带callback参数打印出服务器返回内容);

    b、jquery页支持jsonp,只需将请求的datatype设为“jsonp”;

 

2.document.domain + iframe跨域

要求:主域名服务器必须相同。

如: a.bamaying.com a.html 请求 b.bamaying.com下 b.html 资源

此时a.html,b.html需设置document.domain = 'bamaying.com';, 然后a页面中定义iframe标签,src为b.bamaying.com/b.html;

具体获取内容方法:

$("#iframe").load(function(){
    var jq = document.getElementById('iframe').contentWindow.$
jq.get("http://nealyang.cn/test.json",function(data){
    console.log(data);
    });
});

3.window.name + iframe跨域(get请求)

window.name属性可设置或者返回存放窗口名称的一个字符串。

过程:

如index.html页面请求远端服务器上的数据,我们在该页面下创建iframe标签,该iframe的src指向服务器文件的地址(iframe标签src可以跨域),服务器文件里设置好window.name的值,然后在index.html里面读取iframe中的window.name的值。

 

4.location.hash + iframe跨域(get请求)

 

5.postMessage跨域

包括: 接收信息的message事件、发送信息的postMessage()方法.

postMessage():

otherWindow.postMessage(message, targetOrigin);

otherWindow: 目标窗口(要给哪一个window发送信息);

message: 要发送的信息;

targetOrigin: 限定消息的接收范围,不限制就用*;

 

a.html(http://www.nealyang.cn/a.html)

 

<iframe id="iframe" src="http://www.neal.cn/b.html" style="display:none;"></iframe>
<script>
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {
        var data = {
            name: 'aym'
        };
        // 向neal传送跨域数据
        iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.neal.cn');
    };

    // 接受domain2返回数据
    window.addEventListener('message', function(e) {
        alert('data from neal ---> ' + e.data);
    }, false);
</script>

 

b.html(http://www.neal.cn/b.html)

 

<script>
    // 接收domain1的数据
    window.addEventListener('message', function(e) {
        alert('data from nealyang ---> ' + e.data);
        var data = JSON.parse(e.data);
        if (data) {
            data.number = 16;
            // 处理后再发回nealyang
            window.parent.postMessage(JSON.stringify(data), 'http://www.nealyang.cn');
        }
    }, false);
</script>

 

6.跨域资源共享CORS(主流跨域解决方案,支持所有的http请求)

CORS是一个W3C标准,它允许浏览器向跨源服务器,发出XMLHttpRequest请求。浏览器支持:IE10+, IE8/9需要使用XDomainRequest对象支持;

原理:CORS通信过程,前端是由浏览器自动完成,浏览器一旦发现跨源,就会自动添加一些附加的头信息,有时还会多出附加请求。实现CORS通信关键是服务器,只要服务器实现了CORS接口,就可以跨源通信。

类型: 简单请求、非简单请求。

 

7.webscoket协议跨域

实现了浏览器与服务器的全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。一般使用socket.io。

 

8.node代理跨域

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值