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 头部 是可以解决跨域的

时间: 2024-08-25 19:30:48

Ajax 跨域请求-- Cross Domain的相关文章

JavaScript之Ajax-7 Ajax跨域请求(Ajax跨域概述、Ajax跨域实现)

一.Ajax跨域概述 同源策略 - 同源策略(Same origin policy)是一种约定,它是浏览器的核心也最最基本的核心.如果少了同源策略,则浏览器的正常功能可能都会收到影响.可以说Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现 - 它是由 Netscape 提出的一个著名的安全策略 - 现在所有支持 JavaScript 的浏览器都会使用这个策略 - 所谓同源策略是指,域名.协议.端口相同 域名概述 - 域名(Domain Name) 是由一串用点分隔的名字组成的In

用iframe设置代理解决ajax跨域请求问题

面对ajax跨域请求的问题,想用代理的方式来解决这个跨域问题.在服务器端创建一个静态的代理页面,在客户端用iframe调用这个代理 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题.于是想用代理的方式来解决这个跨域问题. 什么是跨域?简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 方案:在服务器端创建一个静态的代理页面,在

HTML5:使用postMessage实现Ajax跨域请求

HTML5:使用postMessage实现Ajax跨域请求 由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) document.domain+iframe: (2) 动态创建script: (3) iframe+location.hash: (4) flash. 这里不细说这几种方法,记录的是HTML5的window.postMessage.postMessage兼容IE8+.Firefox.Opera.Saf

JQuery的Ajax跨域请求的

JQuery的Ajax跨域请求的(Ajax) 什么是jsonp格式呢?API原文:假设获取的数据文件存放在远程server上(域名不同.也就是跨域获取数据),则须要使用jsonp类型.使用这样的类型的话,会创建一个查询字符串參数 callback=? .这个參数会加在请求的URL后面. server端应当在JSON数据前加上回调函数名.以便完毕一个有效的JSONP请求.意思就是远程服务端须要对返回的数据做下处理,依据client提交的callback的參数,返回一个callback(json)的

Ajax 跨域请求 jsonp获取json数据

遇到Ajax的跨域请求出问题 找了中解决办法如下: 参考内容:http://justcoding.iteye.com/blog/1366102 由于受到浏览器的限制,该方法不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的

JQuery的Ajax跨域请求的解决方案

http://www.open-open.com/lib/view/open1334026513327.html 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式, 于是即刻翻出Jquery的API出来研究,发现JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的 jquery.ajax jsonp格式和jquery.getScript方式. 什么是jsonp

AJAX跨域请求json数据的实现方法

这篇文章介绍了AJAX跨域请求json数据的实现方法,有需要的朋友可以参考一下 我们都知道,AJAX的一大限制是不允许跨域请求. 不过通过使用JSONP来实现.JSONP是一种通过脚本标记注入的方式,它是可以引用跨域URL的js脚本,不过需要提供一个回调函数(必须在您自己的页面上),因此,你可以自己处理结果. 让我们看看JSONP的是怎么在jQuery,MooTools的,Dojo Toolkit中实现的. jQuery的JSONPjQuery.getJSON方法:Js代码 jQuery.get

php中ajax跨域请求---小记

php中ajax跨域请求---小记 前端时间,遇到的一个问题,情况大约是这样: 原来的写法: 前端js文件中: $.ajax({ type:'get', url:'http://wan.xxx.com/xxx.js', success:function(data){ ......... } }) 很简单的一个ajax请求:后面在做迁移的时候,由于系统目录的安排,js文件放到了,img.xxx.com域名下,这样就设计到了跨域问题,于是就改成了这样: $.ajax({ type:'get', ur

jquery ajax跨域请求webservice

有种方式可以通过JSONP方式来请求 这里具体介绍如何通过修改配置文件来实体AJAX跨域请求WEBSERVICE WEBSERVICE的类声名 /// <summary> /// MobileService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)