浅析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 相关文章推荐
jQuery中的常用事件总结
Dec 27 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
May 05 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
BootStrap扔进Django里的方法详解
May 13 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
Sep 18 Javascript
JS数组splice操作实例分析
Oct 12 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
学习ExtJS Column布局
2009/10/08 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
python中p-value的实现方式
2019/12/16 Python
浅谈python锁与死锁问题
2020/08/14 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
超市开学活动方案
2014/03/01 职场文书
聘用意向书范本
2014/04/01 职场文书
药剂专业自荐书
2014/06/20 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android
MySQL transaction事务安全示例讲解
2022/06/21 MySQL