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中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
获取URL文件名后缀
Oct 24 PHP
php实现Session存储到Redis
Nov 11 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
PHPstorm快捷键(分享)
Jul 17 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 PHP
thinkPHP5.1框架中Request类四种调用方式示例
Aug 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
python实现与redis交互操作详解
2020/04/21 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
室内设计自我鉴定
2013/10/15 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
学生会招新宣传语
2015/07/13 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
导游词之镜泊湖
2019/12/09 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
Python Django 后台管理之后台模型属性详解
2021/04/25 Python