浅析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 相关文章推荐
JavaScript 比较时间大小的代码
Apr 24 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
Function.prototype.call.apply结合用法分析示例
Jul 03 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
js定时器实例分享
Dec 20 Javascript
Javascript 对cookie操作详解及实例
Dec 29 Javascript
Windows下Node.js安装及环境配置方法
Sep 18 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
JavaScript获取当前url路径过程解析
Dec 27 Javascript
npm ci命令的基本使用方法
Sep 20 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调用Oracle存储过程的方法
2008/09/12 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
python使用webbrowser浏览指定url的方法
2015/04/04 Python
Python如何为图片添加水印
2016/11/25 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
python import 上级目录的导入
2020/11/03 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
大学生旷课检讨书
2014/01/22 职场文书
大学军训感言400字
2014/03/11 职场文书
ktv筹备计划书
2014/05/03 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
人口与计划生育责任书
2015/05/09 职场文书
复活读书笔记
2015/06/29 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Python标准库pathlib操作目录和文件
2021/11/20 Python
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android