浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法


Posted in Javascript onFebruary 06, 2017

由于同源策略的缘故,ajax不能向不同域的网站发出请求。

比如a站localhost需要向b站请求数据,地址为:http://www.walk-sing.com/api.php

请求的代码如下:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 $.get("http://www.walk-sing.com/api.php", function(data){ 
   alert("Data Loaded: " + data); 
  }); 
</script> 
<body> 
</body> 
</html>

访问该页面,页面空白,按F12打开控制台,可以看到截图所示信息:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

解决方案1:jsonp

我们先来看这样一个例子:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 } 
 alertSomething( 
   {"name":"ben","age":24} 
   ); 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
//  alert("Data Loaded: " + data); 
//  }); 
</script> 
<body> 
</body> 
</html>

执行结果:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

我们也可以这样写:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="alertsomething.js"></script> 
<body> 
</body> 
</html>

alertsomething.js的内容如下:

alertSomething( 
   {"name":"ben","age":24} 
   );

也可以得到截图所示结果。

我们再换一个方式,将alertsomething.js上传到服务器,将代码改为如下形式:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="http://www.walk-sing.com/alertsomething.js"></script> 
<body> 
</body> 
</html>

也可以得到截图所示结果。

不知道大家发现没有,script标签没有同源策略的限制,jsonp正是基于此原理实现的。

jsonp的具体实现可参见如下代码:

jsonp.php

<?php 
$method = isset($_GET['callback']) ? $_GET['callback'] : ''; 
if(!isset($method)){ 
 exit('bad request'); 
} 
$testArr = array( 
 'name' => 'ben', 
 'age' => 23 
); 
echo $method.'('.json_encode($testArr).')';

js代码:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="http://www.walk-sing.com/jsonp.php?callback=alertSomething"></script> 
<body> 
</body> 
</html>

也可以得到截图所示结果。

解决方案二:CORS(跨域资源共享,Cross-Origin Resource Sharing)

不知道大家发现了没有,jsonp只能发送get请求,而如果业务中需要用到post请求时,jsonp就无能为力了。

这时候cors(跨域资源共享,Cross-Origin Resource Sharing)就派上用处了。

CORS的原理:

CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
就拿前面第一个例子来说,我只要在api.php文件头加上如下一句话即可:

header('access-control-allow-origin:*');

再次请求该接口,结果如下截图所示:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

以上所述是小编给大家介绍的jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
js清空表单数据的两种方式(遍历+reset)
Jul 18 Javascript
ExpressJS入门实例
Jan 14 Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
Vue.js仿Select下拉框效果
Feb 18 Javascript
Javascript文本框脚本实现方法解析
Oct 30 Javascript
canvas实现图像布局填充功能
Feb 06 #Javascript
canvas实现图像截取功能
Feb 06 #Javascript
JS跨域请求外部服务器的资源
Feb 06 #Javascript
canvas实现动态小球重叠效果
Feb 06 #Javascript
canvas滤镜效果实现代码
Feb 06 #Javascript
canvas实现图像放大镜
Feb 06 #Javascript
jquery精度计算代码 jquery指定精确小数位
Feb 06 #Javascript
You might like
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
python分布式环境下的限流器的示例
2017/10/26 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
"引用"与多态的关系
2013/02/01 面试题
合同和协议有什么区别?
2014/10/08 职场文书
五四青年节活动总结
2015/02/10 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
医德医风个人总结
2015/02/28 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL