跨域的4种方法

JSONP

HTML中script标签可以加载其它域下的js,我们可以利用这个特性从其它域下获取数据。
但问题是我们获取到的这个数据是JSON格式的数据,直接作为js来执行。
所以我们可以这样做,在发送请求的时候,添加一个名为callback的参数

<script src="http://api.baidu.com/weather.php?callback=showdata"></script>

这个请求到后端后,后端会去检查是否有callback这样一个参数,如果有的话,在将数据返回来之前做一些处理。
如之前后端返回的数据格式为:

{"city": "hangzhou","weather":"晴天"}

现在经过处理后返回数据:

showdata({"city": "hangzhou","weather":"晴天"})

这样浏览器收到这样的数据,把它作为js来执行,相当于调用了showdata这个函数,同时参数是{“city”: “hangzhou”,”weather”:”晴天”}。我们只需要在之前定义好showdata这个全局函数,在函数内部即可处理这些返回的数据。

总结:

JSONP是通过script标签加载数据的方式去获取数据当做js代码来执行,前端需要提前页面上声明一个全局函数,如showdata(),函数名通过接口传参的方式(callback=showdata)传给后台,后台解析到函数名后在原始数据上包裹这个函数名,发送给前端。换句话说,JSONP需要对应接口的后端的配合才能实现。
这里写图片描述

CORS

CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。
实现方式很简单,当你使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。所以 CORS 的表象是让你觉得它与同源的 ajax 请求没啥区别,代码完全一样。
服务端需要在响应头上添加一行:

res.setHeader('Access-Control-Allow-Origin','http://localhost:8080'

这里写图片描述

降域

这种办法只能解决主域相同而子域不同,且是iframe形式的跨域;比如:
两个页面,如分别为 a.jirengu.com 和 b.jirengu.com,可以使用降域的方式来进行跨域,分别在两个页面的js文件中写上 document.domain = ‘jirengu.com’ 即可。保持主页面和嵌套的页面的后缀一致。

PostMessage

降域的一个改进,使得即使是在两个不同的域的页面,也可以进行数据的交互,
这是HTML5中提供的属性,一般适合在同一父级目录下的两个页面进行数据的传输
如a,b两个页面,b页面通过iframe标签显示在a页面内
例如在a页面中写出如下代码

$event.addEventListener('input',function(){
    window.frames[0].postMessage(this.value.'*');
})
//a页面向要嵌套的b页面发送一个message,‘*’表示在任何域下都可以接受

然后在b页面中写出如下代码

window.addEventListener('message',function(e) {     console.log(e.data); });
//在b页面监听message事件,当有这个事件出现,表示有页面嵌套了这个页面,然后可以去处理这个事件,返回对应的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值