详解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 相关文章推荐
浅析JQuery获取和设置Select选项的常用方法总结
Jul 04 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
javascript中的循环语句for语句深入理解
Apr 04 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 Javascript
jQuery css() 方法动态修改CSS属性
Sep 25 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
Dec 14 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
May 17 Javascript
JS使用正则表达式验证身份证号码
Jun 23 Javascript
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
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遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
python2.7安装图文教程
2018/03/13 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
Python eval函数原理及用法解析
2020/11/14 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
国际领先的学术出版商:Springer
2017/01/11 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
儿科护理实习自我鉴定
2013/09/19 职场文书
店长助理岗位职责
2013/12/13 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
MySQL数据库 安全管理
2022/05/06 MySQL