PHP处理Ajax请求与Ajax跨域问题


Posted in PHP onFebruary 13, 2017

PHP判断是否为Ajax请求

我们知道,在发送ajax请求的时候,可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $.get, 或者$.post方法请求网页内容时,它会向服务器传递一个HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是否是ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。一般情况下$_SERVER['HTTP_X_REQUESTED_WITH']默认是XMLHttpRequest,$_SERVER['HTTP_X_REQUESTED_WITH']也可以自定义创建的,使用XMLHttpRequest.setRequestHeader(name,value)

示例:前端页面发送普通的ajax请求给后端test.php。

$.ajax({
  type: "GET",
  url: 'test.php',
  success: function(data) {
    console.log(data);
  }
});

服务端test.php可以判断该请求是不是Ajax异步请求,然后根据业务需求做出响应的回应。

以下是服务端test.php的简单验证是否为ajax请求的代码:

function isAjax() {
  return @$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ? true : false;
}
if (isAjax()) {
  echo 'Ajax Request Success.';
} else {
  echo 'No.';
}

Ajax发起JSONP跨域请求

我们通过jQuery的JSONP方式可以实现跨域ajax请求,服务端php也需要做出相应的处理,也就是说php这边必须和前端页面按照一定的格式请求和返回数据。

示例:前端页面发起JSONP请求:

$.ajax({
  type: "get",
  data: "random="+Math.random(),
  url: "http://demo.3water.com/phpajax/jsonp.php",
  dataType: "jsonp",
  jsonp: "callback",
  success: function(data) {
   console.log(data);
  },
  error: function() {
   console.log('Request Error.');
  }
});

我们会发现,ajax请求参数中有 dataType: "jsonp" 和 jsonp: "callback" ,这个就表明了我要请求的是jsonp,并且会有回调callback返回。当然,我们也可以自定义回调函数,如 jsonpCallback:"success_jsonpCallback"

还可以简单的写成:

jQuery.getJSON('http://demo.3water.com/phpajax/jsonp.php?callback=?",{
 random: Math.random()
}, function(data){
 console.log(data);
});

php后端服务代码可以这样写(注意输出返回的格式):

$data = array(
  'rand' => $_GET['random'],
  'msg' => 'Success'
);
echo $_GET['callback'].'('.json_encode($data).')';

Ajax跨域请求:CORS

CORS,又称跨域资源共享,英文全称Cross-Origin Resource Sharing。假设我们想使用Ajax从a.com的页面上向b.com的页面上要点数据,通常情况由于同源策略,这种请求是不允许的,浏览器也会返回“源不匹配”的错误,所以就有了“跨域”这个说法。但是我们也有解决办法,我们可以再b.com的页面header信息中增加一行代码:

header("Access-Control-Allow-Origin: *");

当我们设置的header为以上信息时,任意一个请求过来之后服务端我们都可以进行处理和响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“*Access-Control-Allow-Origin:* ”,表示我们已经启用CORS,如果要限制只允许某个域名的请求,可以这样:

header("Access-Control-Allow-Origin: https://3water.com");

示例:通过CORS跨域请求数据

$.ajax({
  type: "get",
  data: "random="+Math.random(),
  url: "http://demo.3water.com/phpajax/ajax.php",
  dataType: "json",
  success: function(data) {
    console.log(data);
    $("#result_3").html(data.msg+':'+data.rand);
  },
  error: function() {
   $("#result_3").html('Request Error.');
  }
});

我们在另一个网站域名下的ajax.php加上这样的代码:

header("Access-Control-Allow-Origin: https://3water.com");
$data = array(
  'rand' => $_GET['random'],
  'msg' => 'Success'
);
echo json_encode($data);

这就实现了从3water.com页面发起跨域异步请求到域名路径demo.3water.com/phpajax/ajax.php,并得到响应。

以上所述是小编给大家介绍的PHP处理Ajax请求与Ajax跨域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
一个php作的文本留言本的例子(二)
Oct 09 PHP
新闻分类录入、显示系统
Oct 09 PHP
PHP 存取 MySQL 数据库的一个例子
Oct 09 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php中in_array函数用法分析
Nov 15 PHP
浅析php工厂模式
Nov 25 PHP
前端必学之PHP语法基础
Jan 01 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
Sep 14 PHP
PHP7基于curl实现的上传图片功能
May 11 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
curl 出现错误的调试方法(必看)
Feb 13 #PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 #PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 #PHP
yii2 数据库读写分离配置示例
Feb 10 #PHP
php 基础函数
Feb 10 #PHP
PHP isset()与empty()的使用区别详解
Feb 10 #PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 #PHP
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
php 验证码制作(网树注释思想)
2009/07/20 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
javascript 闭包详解
2015/07/02 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
python3处理含有中文的url方法
2018/05/10 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
四年级下册教学反思
2014/02/01 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers