php跨域发送请求原理以及同步异步问题
<script async type="text/javascript" src="http://lisi.com/data.php?flag=1"></script>
<script type="text/javascript">
// script标签默认请求是同步的,也就是第一个标签没有得到服务器响应内容时,后续的的标签只能等待
// 如果希望标签的请求变成异步的,可以给标签添加一个async属性
console.log(abc);
</script>- <script type="text/javascript">
/*
动态创建script标签,这种方式默认就是异步的
*/
var script = document.createElement('script');
script.src = 'http://lisi.com/data1.php?callback=abc';
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
// 这个函数由谁调用?后台返回的内容(js代码-函数调用)来调用
// 回调函数(不是自己调用,而是“别人”调用)
function abc(param){
console.log(param.username);
}
</script>
//跨域对应的文件夹
<?php
$flag=$_GET['callback'];
echo $flag.'({"username":"xiaobai","age":"18"})';//返回的内容是【函数调用】
?>
ajax方法既支持json也支持jsonp
*/
function ajax(obj){
// 默认值
var defaults = {
type : 'get',
jsonp : 'callback',
url : '#',
data : {}
}
// 覆盖默认参数
for(var key in obj){
defaults[key] = obj[key];
}if(defaults.dataType == 'jsonp'){
// 跨域处理
_ajax4Jsonp(defaults);
}else{
// ajax处理
_ajax4Json(defaults);
}
}function _ajax4Json(obj){
// 1、创建xhr对象
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
// 处理参数
var param = '';
// 处理对象形式的参数
// 把{username:'lisi',age:12,gender:'male'}
// 转成username=lisi&age=12&gender=male
for(var key in obj.data){
// 拼接一个参数
param += key + '=' + encodeURIComponent(obj.data[key]) + '&'
}
if(param){
// 去掉最后一个字符
param = param.substring(0,param.length - 1);
}
if(obj.type == 'get'){
// 对于get请求要把参数拼接到url中
obj.url += '?' + param;
}
// 2、配置发送参数
xhr.open(obj.type,obj.url);
// 3、执行发送动作
var data = null;
if(obj.type == 'post'){
data = param;
// 设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
}
xhr.send(data);
// 4、处理响应(指定回调函数)
xhr.onreadystatechange = function(){
if(xhr.status == 200 && xhr.readyState == 4){
// 获取服务器响应数据
var result = xhr.responseText;
if(obj.dataType == 'json'){
// 如果要求是json格式,那么就把json字符串转成对象
result = JSON.parse(result);
}
// 调用回调函数
obj.success(result);
}
}
}function _ajax4Jsonp(obj){
// 业务参数转换
// 把{"username":"lisi","age":"12"}格式的数据转成username=lisi&age=12
var param = '';
for(var key in obj.data){
param += key + '=' + obj.data[key] + '&';
}
// if(param){
// param = param.substring(0,param.length - 1);
// }// 生成默认的回调函数的名称
var cbName = 'jQuery' + ('v1.11.1' + Math.random()).replace(/\D+/g,'') + '_' + (new Date().getTime());
if(obj.jsonpCallback){
// 如果调用方法的时候传递了回调函数的名称就把默认的覆盖掉
cbName = obj.jsonpCallback;
}// 回调函数
window[cbName] = function(data){
obj.success(data);
}
// 后台返回的内容是函数调用
// jQuery12312312312312321_43213123123(23123);// 创建script标签,然后追加到head标签中
var script = document.createElement('script');
script.src = obj.url + '?' + param + obj.jsonp + '=' + cbName;
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
}
php跨域发送请求原理以及同步异步问题的更多相关文章
- 使用jsonp跨域发送请求
如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型. 使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面. ...
- 跨域post请求实现方案小结--转
[名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...
- Ajax跨域:Jsonp原理解析
推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...
- JS跨域方法及原理
JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...
- 使用$.getJSON实现跨域ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- Java跨域以及实现原理
最近研究了一下跨域,没接触之前我的印象就是配合单点登录的一种方式,后来在网上看到资料才知道不仅仅是这一种,用法很多,具体的可以去网上搜索. 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访 ...
- JQuery实现Ajax跨域访问--Jsonp原理
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- 【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)
在vue-cli 项目中很多人会用到mock 数据(模拟数据),但是我觉得如果在真实的数据库交互中开发会更有安全感一些,所以查了一下百度很多人推荐的就是: 跨域! 跨域是什么概念?不同的主机名,同主机 ...
- 004. 前端跨域资源请求: JSONP/CORS/反向代理
1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...
随机推荐
- netty源码解析目录
第一章 java nio三大组件与使用姿势 二.netty使用姿势 三.netty服务端启动源码 四.netty客户端启动源码 五.NioEventLoop与netty线程模型 六.ChannelPi ...
- 集群安装Java环境
需要安装一个集群环境,发现全部要手动安装java.记录下安装Java环境的过程.虽然,依旧是挨个安装,但总算是有体系了. java 找到下载地址: https://www.oracle.com/tec ...
- 【网络安全】SSLSplit实现中间人攻击
中间人攻击,即在中间监听获取网络数据以便获取的有价值的信息实现攻击破坏的目的,即client-mid man-server,此处介绍的sslsplit可以作为mid man监听ssl信息及HTTP信息 ...
- oralce 11.2.0.4手动创建EM
安装完oracle,启动dbconsole,失败 [oracle@elearning admin]$ emctl start dbconsole OC4J Configuration issue. / ...
- spring拦截器中使用spring的自动注入
需要在spring的拦截器中使用自定义的服务,这要就设计到将服务注入到拦截器中.网上看的情况有两种: 1. @Configuration public class OptPermissionHandl ...
- C#做单元测试,如何查看输出的调试信息?
- Effective Java 第三版——68. 遵守普遍接受的命名约定
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- python3 --- locale命名空间让程序更加安全了
[简介] 由于python-2.x 并没有locale这个层次的命名空间,所以临时变量有可能会泄漏,进而影响到了包涵它的命名空间 [看一下pyhont-2.x是怎么泄漏临时变量的] python Py ...
- Docker的学习
学习地址:http://blog.51cto.com/lizhenliang 和 他的视频 一 Docker 的介绍和安装 二 镜像管理 三 容器管理 四 管理应用程序数据 五 使用Docker知 ...
- 国外优秀C/C++网站
1.https://en.cppreference.com/w/ 2.https://www.geeksforgeeks.org/ 3.https://www.tutorialspoint.com/c ...