详解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 相关文章推荐
Javascript Global对象
Aug 13 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
Nov 14 Javascript
js实现无缝循环滚动
Jun 23 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
Mar 04 Javascript
详解如何在react中搭建d3力导向图
Jan 12 Javascript
vue项目中axios使用详解
Feb 07 Javascript
基于vue中解决v-for使用报红并出现警告的问题
Mar 03 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 Javascript
Node.js实现断点续传
Jun 23 Javascript
JavaScript实现简单拖拽效果
Sep 15 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
一个PHP+MSSQL分页的例子
2006/10/09 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
composer.lock文件的作用
2016/02/03 PHP
学习ExtJS accordion布局
2009/10/08 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
JavaScript实现区块链
2018/03/14 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
Python如何输出警告信息
2020/07/30 Python
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
运动会邀请函范文
2014/02/06 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
程序员求职信
2014/04/16 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
会议开幕词
2015/01/28 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书