详解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编写COM组件的步骤
Mar 17 Javascript
JQuery切换显示的效果实例代码
Feb 27 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
jQuery检测输入的字符串包含的中英文的数量
Apr 17 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
JS常用知识点整理
Jan 21 Javascript
JS实现的base64加密解密操作示例
Apr 18 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
vue实现图片上传预览功能
Dec 23 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
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
基于mysql的论坛(6)
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
JS 判断undefined的实现代码
2009/11/26 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
微信小程序实现时间进度条功能
2020/11/17 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Django model反向关联名称的方法
2018/12/15 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
python实现数据分析与建模
2019/07/11 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
石油大学毕业生自荐信
2014/01/28 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
服务理念标语
2014/06/18 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers