浅析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中的闭包原理分析
Mar 08 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
Jan 15 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
JavaScript中的继承方式详解
Feb 11 Javascript
js闭包所用的场合以及优缺点分析
Jun 22 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
微信小程序实现多行文字滚动
Nov 18 Javascript
JavaScript如何优化逻辑判断代码详解
Jun 08 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读取IMAP邮件
2006/10/09 PHP
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
PHP 面向对象详解
2012/09/13 PHP
PHP7 新增功能
2021/03/09 PHP
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
Python部署web开发程序的几种方法
2017/05/05 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
vue路由实现登录拦截
2021/03/24 Vue.js
大专生简历的自我评价
2013/11/26 职场文书
就业自荐书
2013/12/05 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
学校政风行风整改方案
2014/10/25 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
教师听课评语大全
2014/12/31 职场文书
决心书格式范文
2015/09/23 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server