详解js跨域请求的两种方式,支持post请求


Posted in Javascript onMay 05, 2018

JSONP实现跨域

常用的jquery实现跨域调用

$.ajax({
  url: "http://127.0.0.1/~chenjiebin/mycode/php/crossdomain/index.php",
  dataType: "jsonp",
  jsonp: "callback",
  context: document.body,
  success: function(data) {
    console.log(data);
  }
});

这个调用实际上的实现原理是
在网页中构造一个script标签,将src设置为对应的url,并增加上相应的callback参数,形如如下格式:

<script src="http://127.0.0.1/~chenjiebin/mycode/php/crossdomain/index.php?callback=jQuery211018970995225637144_1465350372062&_=1465350372063"></script>

请求的服务端代码如下:

$data   = json_encode(array("id" => "1", "name" => "tom"));
$callback = $_GET["callback"];
echo $callback . "(" . $data . ")";

实际上最后返回的内容就是一段js代码:

jQuery211018970995225637144_1465350372062({"id":"1","name":"tom"})

当浏览器获取到该段js代码后就会执行这个函数,从而实现回调ajax请求时设置的success方法。

jsonp实现的缺点

了解了原理后,就知道jsonp实现的跨域方式不支持post请求,只能支持get请求。但是如果需要支持post请求该怎么办呢?下面谈下服务器端设置的方式。

服务端设置支持跨域

主要是Access-Control-Allow-Origin头参数,该参数用来指定允许哪个来源的域请求。服务端代码如下:

// 表示支持所有来源的域进行请求
// 实际在操作过程中可以设置为指定域
header('Access-Control-Allow-Origin:*');
$data = json_encode(array("id" => "1", "name" => "tom"));
echo $data;

对应的js代码:

$.ajax({
  type: "POST",
  url: "http://127.0.0.1/~chenjiebin/mycode/php/crossdomain/header.php",
  dataType: "json",
  success: function(data) {
    console.log(data);
  }
});

可以支持post请求。

小结

实际上个人并不是特别喜欢用跨域请求的方式,可能会带来一些不可预见的安全问题。比较习惯的方式通过本域下的服务端和跨域的源服务器进行交互。

Javascript 相关文章推荐
JS 两个字符串时间的天数差计算
Aug 25 Javascript
jQuery列表拖动排列具体实现
Nov 04 Javascript
JS图像无缝滚动脚本非常好用
Feb 10 Javascript
jquery取消选择select下拉框示例代码
Feb 22 Javascript
javascript事件冒泡详解和捕获、阻止方法
Apr 12 Javascript
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
JavaScript严格模式详解
Nov 18 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
JS Testing Properties 判断属性是否在对象里的方法
Oct 01 Javascript
Ionic学习日记实现验证码倒计时
Feb 08 Javascript
利用vue.js实现被选中状态的改变方法
Feb 08 Javascript
解决angularjs中同步执行http请求的方法
Aug 13 Javascript
vue 注册组件的使用详解
May 05 #Javascript
Vue三层嵌套路由的示例代码
May 05 #Javascript
动态加载JavaScript文件的3种方式
May 05 #Javascript
Node.js的Koa实现JWT用户认证方法
May 05 #Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 #Javascript
Angular模版驱动表单的使用总结
May 05 #Javascript
浅谈Angular HttpClient简单入门
May 04 #Javascript
You might like
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
javascript 应用小技巧方法汇总
2015/07/05 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
Python中的闭包详细介绍和实例
2014/11/21 Python
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
python编程开发之日期操作实例分析
2015/11/13 Python
python 简单的多线程链接实现代码
2016/08/28 Python
python如何实现代码检查
2019/06/28 Python
pandas取出重复数据的方法
2019/07/04 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
详解Python IO口多路复用
2020/06/17 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
电子商务专业学生的学习自我评价
2013/10/27 职场文书
创业计划书六个要素
2013/12/26 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
会计师事务所实习证明
2014/11/16 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
法律讲堂观后感
2015/06/11 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
Python绘制散乱的点构成的图的方法
2022/04/21 Python