问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Ajax跨域问题的出现和解决什么是跨域

发布网友 发布时间:2022-04-06 05:40

我来回答

2个回答

懂视网 时间:2022-04-06 10:02

示例:前端页面发送普通的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.jb51.net/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.jb51.net/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://www.jb51.net");

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

$.ajax({
 type: "get",
 data: "random="+Math.random(),
 url: "http://demo.jb51.net/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://www.jb51.net");
$data = array(
 'rand' => $_GET['random'],
 'msg' => 'Success'
);
echo json_encode($data);

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

相关视频推荐:PHP编程从入门到精通

热心网友 时间:2022-04-06 07:10

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全*。

解决跨域问题可以使用代理解决, 比如nginx等
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我国刑法对对单位行贿罪的立案规定是什么 上述构成对单位行贿罪需要满足哪些条件 劳动仲裁申请书的注意事项有哪些 申请劳动仲裁需要注意事项有哪些 劳动仲裁的时候要注意什么 构成非法走私制毒物品罪既遂怎么量刑 工地受伤找劳动局有用吗 被判有期徒刑或以上有什么刑罚? 对学生进行抢劫,并造成重伤判处有期徒刑属于什么违法行为? 12123上如何查询我的驾考时间是否过期 ajax是否能跨域请求 解决的办法 如何解决ajax跨域请求失败的问题 在Win10系统中怎样找到Edge浏览器的安装路径 Win10 edge浏览器收藏夹在什么位置 远航技术u盘win10系统怎么找到Edge浏览器的安装路径 win10 edge浏览器在哪 Win10 Edge浏览器默认安装位置在哪 win10 edg浏览器在C盘什么位置 win10edge浏览器文件夹位置 win10的edge浏览器放在什么位置 win10edge浏览器在哪 win 10 edge浏览器在哪 STEAM荒岛求生0.27最新版怎么造墙 在steam上下的荒岛求生程序错误怎么办 求 荒岛求生中文版 32位 最新版 下载及安装教程 steam怎么找不到荒岛求生 [image]5 steam上的荒岛求生怎么调成窗口模式啊,求大神,指导啊求上图 steam下的正版荒岛求生进不去显示这个,怎么办?点“是”又弹出这个 荒岛求生怎么开全屏 变形金刚塞伯坦之战为什么从steam上下架了? AJAX跨域访问解决方法 求ajax跨域问题解决方法 AJAX可以跨域访问么?不行的话有什么解决方案么? AJAX跨域发送XML用PHP做代理的解决方法,超级高手进~非常感谢 前端面试get和post区别是什么?ajax跨域如何解决 AJAX怎么解决跨域问题 ajax跨域访问thinkphp5.0怎么把数组返回给前台 如何用ajax传值到php页面 PHP通过微信跳转的Code参数获取用户的openid(关键代码) 求助,微信内置浏览器打开的网页,获取微信用户openid 微信获取用户信息 php源代码 PHP网页怎么获取微信昵称? php怎么做用户登录之后获取相应的用户信息? php 微信公众平台点击view获取openID php微信开发获取用户资料报错48001 微信开发,php获取用户地理位置,求php解析xml并输出经纬度的方法 PHP如何实现上传功能?能否把代码写下,谢谢 请问怎么用php写文件上传功能呢,最好有代码示例! 求PHP网页上传文件代码. 我想用php写上传功能的代码请问怎么写?