详解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 相关文章推荐
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
Apr 27 Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 Javascript
JSON辅助格式化处理方法
Mar 26 Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
jquery实现九宫格大转盘抽奖
Nov 13 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
Aug 08 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
Apr 29 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教程 基本语法
2009/10/23 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
javascript模拟命名空间
2015/04/17 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
详解python UDP 编程
2020/08/24 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
电力安全事故反思
2014/04/27 职场文书
任命书格式
2014/06/05 职场文书
保险公司开门红口号
2014/06/21 职场文书
安全检查汇报材料
2014/12/26 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
消防演习感想
2015/08/10 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书