PHP判断ajax请求的原理:
在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $.get, or $.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);
//服务端
function is isAjax() {
if (SERVER('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest') {
$isajax = !empty($_GET['_return']) ? $_GET['_return'] : 1;
$ajax_request = 1;
}
return $isajax;
}
//客户端
$.ajax({
type : "GET",
url : base_url + 'php_check_ajax_request/get_user_list.html',
beforeSend : function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("request_type","ajax");
},
success : function(data){
$("#user_list").html(data);
$tip.hide();
$button.attr('disabled',true);
}
});
关于AJAX跨域请求json数据的实现方法
通过jQuery的JSONP
jQuery.getJSON方法:
jQuery.getJSON('http://search.twitter.com/search.json/.callback=?",{
q:"Arsenal"
}, function(tweets){
console.info('twitter retrund:', tweets);
});
也可以使用如下 代码:
$.ajax({
type: "get",
data: "random="+Math.random(),
url:url,
dataType:"jsonp",
jsonp:"callback",
success: function(data){
$.each(data, function(key,val){
$("#myDiv").html($("#myDiv").html()+val.cvalue+"</br>");
)}
}
})
AJAX POST&跨域 解决方案 - CORS
CORS(跨域资源共享,Cross-Origin Resource Sharing)
假设我们页面或者应用已在 http://www.test1.com 上了,而我们打算从 http://www.test2.com 请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误,"跨域"也就以此由来。
利用 CORS,http://www.test2.com 只需添加一个标头,就可以允许来自 http://www.test1.com 的请求,下图是我在PHP中的 hander() 设置,“”号表示允许任何域向我们的服务端提交请求:
也可以设置指定的域名,如域名 http://www.test2.com ,那么就允许来自这个域名的请求*:
当前我设置的header为“”,任意一个请求过来之后服务端我们都可以进行处理&响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“Access-Control-Allow-Origin:** ”,表示我们已经启用CORS