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 相关文章推荐
xajax写的留言本
Nov 25 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php不用正则验证真假身份证
Nov 06 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
PHP中余数、取余的妙用
Jun 29 PHP
PHP数组实例详解
Jun 26 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
php技巧小结【推荐】
Jan 19 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 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
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP文件操作实例总结
2016/09/27 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
德国旅游网站:weg.de
2018/06/03 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
外语系毕业生自荐信范文
2013/12/16 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
创新型城市实施方案
2014/03/06 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers