出于浏览器的同源策略限制,不同站点之间的数据一般是不共享的,在A站点中去拿B站点的数据时就会产生一个跨域问题。
只要浏览器中报错的关键字包含`CORS`,都可以认为是产生了跨域问题
一、跨域
出于浏览器的同源策略限制,不同站点之间的数据一般是不共享的,在A站点中去拿B站点的数据时就会产生一个跨域问题。
只要浏览器中报错的关键字包含CORS
,都可以认为是产生了跨域问题。
注意,不同的协议、端口号、域名、二级域名等都是不同的站点。
比如以下都会产生跨域问题:
imqd.cn与a.imqd.cn 二级域名不同
www.imqd.cn与 www.imqd.cn:8080 端口不同
但是如果只有路径不同,则不存在跨域:
www.imqd.cn/a
www.imqd.cn/b
二、如何解决跨域问题
- 让数据站点开放访问权限,几乎不可能,除非是自家公司,或对方选择开放
- 通过JSONP光明正大的去拿-JSONP是用来解决跨域问题的
三、数据为王,如何知道JSONP的地址
1、问后端(除非是自己的公司)
2、通过网络面板获取(技巧)
a、打开浏览器的开发者工具
b、清空网络面板
c、发送一个请求,比如输入内容,看看网络面板的请求状态,找下有没有xhr等
d、点击打开该网络地址,看看是不是数据源
以上步骤请参考上方视频。
四、JS中如何实现跨域(即跨域原理)
JSONP的含义:jsonp==json with padding
问题:为什么JSON数据要放到函数里。
跨域一般的json数据用不了,只能用jsonp数据。
实现原理:
1、使用script标签引入数据(将json数据放入函数调用的参数中)
2、定义函数,函数即为上面的函数
3、在定义的函数内使用传过来的数据
4、优化:将script带来的数据作为动态加载,只有需要的时候才请求,这样就做到了类似于ajax的效果
看不太明白?下方添加web前端老罗的微信,为你解答。
三、jQuery怎么使用jsonp
jquery对jsonp进行一次重新包装,看起来跟ajax一模一样。
$.ajax({
url:"jsonp地址",
dataType:"jsonp", //这里的类型要改为jsonp
jsonp:'回调函数的名字', //一般填写url中包含有cb或callback
// 获取成功后的回调函数
success:function(res){
},
// 如果获取失败,则执行下面的回调函数
error:function(err){
console.log('失败了')
}
});
比如:
jsonp
的地址为:
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery3410994497906717867_1580475331590
那么在jquery中可以这样写:
$.ajax({
url:"https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5",
dataType:"jsonp", //这里的类型要改为jsonp
jsonp:'callback', //一般填写url中包含有cb或callback
// 获取成功后的回调函数
success:function(res){
},
// 如果获取失败,则执行下面的回调函数
error:function(err){
console.log('失败了')
}
});
以上代码复制后到html中,直接在浏览器中打开即可在浏览器控制台看到效果,不需要服务器环境。