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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php中使用websocket详解
2016/09/23 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
用console.table()调试javascript
2014/09/04 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
vue中监听返回键问题
2019/08/28 Javascript
详解python函数传参是传值还是传引用
2018/01/16 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
tensorflow多维张量计算实例
2020/02/11 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
Java面试题及答案
2012/09/08 面试题
中国梦我的梦演讲稿
2014/04/23 职场文书
员工培训协议书
2014/09/15 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
先进党组织事迹材料
2014/12/26 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
Python 如何安装Selenium
2021/05/06 Python
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS