Ajax 跨域请求-- Cross Domain

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax 跨域请求-- Cross Domain相关的知识,希望对你有一定的参考价值。

在认识 跨域 之前,先简单了解下域名和协议名,比如下面这个 URL


http://mail.163.com/index.html


http://              协议名,也就是HTTP超文本传输协议

mail                  服务器名

163.com           域名

mail.163.com    网站名

/                        根目录

index.html         根目录下的默认网页


1、什么是跨域请求?

请求的下一个资源所在的 协议域名端口号 三者之一与当前资源不一致就称为 跨域请求


简单理解,就是 $.get(url, [data], [callback], [type]) 里面的 url 的协议名、域名 或者 端口号与当前域名不一样

技术分享


为了避免晦涩难懂的文字,我们直接上一个小 demo:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<h2>非跨域请求</h2>
<button id="btn1">非跨域按钮</button>

<h2>跨域请求</h2>
<button id="btn2">跨域按钮</button>

<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.js"></script>
<script>
    $(‘#btn1‘).click(function(obj){
        $.get(‘http://localhost:8081/Ajax/2.php‘,function(){
            console.log(‘btn1被单击后发起的XHR请求‘);
            console.log(obj);
        })
    })

    $(‘#btn2‘).click(function(obj){
        $.get(‘http://dapengtalk.blog.51cto.com/‘,function(){
            console.log(‘btn2被单击后发起的XHR请求‘);
            console.log(obj);
        })
    })

</script>
</body>
</html>


在浏览器地址栏输入“http://localhost:8081/Ajax/cross.html”打开页面,点击“非跨域按钮”,查看控制台

技术分享

打开“Network”

技术分享---------------------------------------------------------------------------------------------------------

点击“跨域按钮”,查看控制台,发现 XHR请求失败了,很明显,请求的域名不同,这就是典型的跨域

技术分享



2、浏览器允许 跨域请求吗?


允许:<img src="跨域的图片">

允许:<link rel="stylesheet" href="跨域的CSS">

允许:<a src="跨域的链接">

允许:<script src="跨域的JS">

禁止AJAX请求是不允许跨域的!


说明:出于安全考虑,所有的浏览器默认都禁止使用XHR异步的跨域请求。


举个例子,比如上面提到的 img 允许跨域


<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<img src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png" alt="百度logo">

</body>
</html>


技术分享


不同协议名、不同域名,网页正常显示图片,说明允许跨域。但是文章一开始的 demo 中,使用 Ajax 发起异步请求的时候,却是不被允许的。那该怎么办呢?


3、跨域 解决方案


3-1、设置“Access-Control-Allow-Origin”头部


还记得吗?域名和域名对应的ip 也是不允许跨域的,在此基础上,我们把上面的例子稍作修改:

(尽管是同一个 2.php 页面,但一个是域名,一个是域名对应的ip)


HTML代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<h2>非跨域请求</h2>
<button id="btn1">非跨域按钮</button>

<h2>跨域请求</h2>
<button id="btn2">跨域按钮</button>

<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.js"></script>
<script>
    $(‘#btn1‘).click(function(obj){
        $.get(‘http://localhost:8081/Ajax/2.php‘,function(){
            console.log(‘btn1被单击后发起的XHR请求‘);
            console.log(obj);
        })
    })

    $(‘#btn2‘).click(function(obj){
        $.get(‘http://127.0.0.1:8081/Ajax/2.php‘,function(){
            console.log(‘btn2被单击后发起的XHR请求‘);
            console.log(obj);
        })
    })

</script>
</body>
</html>


PHP代码:

<?php
header(‘Content-Type: application/json; charset=utf8‘);


$data = [‘uname‘=>‘Tom‘,‘age‘=>20];

echo json_encode($data);


点击“非跨域按钮“,可以正常发起 Ajax 请求

技术分享

点击“跨域按钮”,报错了,说明这个属于 跨域

技术分享

按照控制台给出的提示,我们在 php 页面中设置 Access-Control-Allow-Origin 头部


PHP代码:

<?php
header(‘Content-Type: application/json; charset=utf8‘);

// 指定允许其他域名访问  
header(‘Access-Control-Allow-Origin:*‘);  


$data = [‘uname‘=>‘Tom‘,‘age‘=>20];

echo json_encode($data);


看到 btn2,真是太难得了,这个也就说明 设置 Access-Control-Allow-Origin 头部 是可以解决跨域的

技术分享


本文出自 “dapengtalk” 博客,请务必保留此出处http://dapengtalk.blog.51cto.com/11549574/1876874

以上是关于Ajax 跨域请求-- Cross Domain的主要内容,如果未能解决你的问题,请参考以下文章

IInternetSecurityManager URLACTION_CROSS_DOMAIN_DATA 和 Webbrowser 控制中跨域 XMLHTTP 请求的异步可插入协议

附加 location.href 属性和 ajax-cross-domain.com 脚本的动态 Javascript

为啥新页面的ajax请求中没有携带Cross-Domain Cookies?

跨域 Ajax 调用与 php 请求 [重复]

HTML5 AJAX跨域请求

将站点转移到 SSL 后,跨域请求被 Ajax 阻止