浅析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 Change与bind事件代码
Sep 29 Javascript
jQuery代码优化之基本事件
Nov 01 Javascript
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
javascript基本类型详解
Nov 28 Javascript
jQuery实现的AJAX简单弹出层效果代码
Nov 26 Javascript
JavaScript动态设置div的样式的方法
Dec 26 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
Angular ui.bootstrap.pagination分页
Jan 20 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
Mar 15 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
从源码角度来回答keep-alive组件的缓存原理
Jan 18 Javascript
原生JavaScript实现换肤
Feb 19 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
服务器端解压缩zip的脚本
2006/12/22 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
javascript 短路法代码精简
2009/08/20 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jquery ajax执行后台方法
2010/03/18 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
为什么称python为胶水语言
2020/06/16 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
2015年校长新年寄语
2014/12/08 职场文书
闪闪红星观后感
2015/06/08 职场文书
Oracle笔记
2021/04/05 Oracle
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android