浅析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实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
js 操作符汇总
Nov 08 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 Javascript
jQuery实现加入购物车飞入动画效果
Mar 14 Javascript
超漂亮的jQuery图片轮播特效
Nov 24 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
Aug 09 Javascript
JS简单实现滑动加载数据的方法示例
Oct 18 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
layui动态加载多表头的实例
Sep 05 Javascript
BootStrap前端框架使用方法详解
Feb 26 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
33道php常见面试题及答案
2015/07/06 PHP
PHP中phar包的使用教程
2017/06/14 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
详解Python流程控制语句
2020/10/28 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
大二学生职业生涯规划书
2014/02/05 职场文书
党员党性分析材料
2014/02/17 职场文书
大学活动总结格式
2014/04/29 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL