跨域

什么是跨域?

说跨域之前先要谈几个概念。跨域问题要从同源策略谈起,那什么是同源策略呢?
同源是下面三项都相同,缺一不可

协议+域名+端口

如果不同源,只可以引用css、js、php等文件,但不可以读写这些资源,这就是同源策略最通俗的描述。

看个浏览器报错例子:
我利用SAE同一项目下的两个域名http://1.georgema.applinzi. comhttp://2.georgema.applinzi.com(注意这两个域名是不同源的)发送ajax请求,在浏览器中可以看到报错。

同源策略限制报错

如果我们要打破这个限制就需要跨域

实现跨域有很多种方法,下面介绍几种:

跨域方法

第一种:降域

降域通俗地讲就是把域名变成符合同源的。

  • document.domain的设置规则:
    1. 只能设置为比它更高级的域名,www.a.first.comdocument.domain 可设置为 a.first.com ,也可以是 first.com ,但不可以是 google.com
    2. 假设www.a.first.comdocument.domain被设置为 first.com 就不能再向下重新设置为 a.first.com
//以2.georgema.applinzi.com为例
<body>
    <iframe src='//1.georgema.applinzi.com/'></iframe>
    <h1>
        跨域测试
    </h1>
<script>
//这里的domain只能设置为上级的域名
document.domain='georgema.applinzi.com';
    var ifr=window.frames;
    ifr.onload=function(){
        // to do...
    }
</script>
</body>
//同时1.georgema.applinzi.com中也要设置domain
<script>
    document.domain='georgema.applinzi.com';
    function(){
      //to do...
    };
</script>
  • 这种方法的局限性很大,一般只用来解决不同iframe之间的通信
  • 降域之后上级域名下所有子域的安全性受到威胁

第二种:JSONP

  • 这种方法利用的是浏览器允许script跨域
  • 动态添加的script中加入json格式数据,实现数据读写

先看怎么实现动态script

//在2.georgema.applinzi.com里读取www.1.georgema.applinzi.com/user.js传回的json数据
var script = document.createElement('script');
window.getUsername = function(data){
    var p = document.createElement('p');
    p.innerText='username: '+data.name;
    document.body.appendChild(p);
}
script.src="//1.georgema.applinzi.com/user.js?callback='getUsername''";
document.body.appendChild(script);

//www.1.georgema.applinzi.com/user.js中的json
getUsername({
    'name': 'Nicholas'
})

发送ajax得到json数据(和上面方法是一样的,都是利用get请求返回json数据)就是 JSONP方法了

$.ajax({
    url:'//1.georgema.applinzi.com/user.js',
    dataType:'jsonp',
    jsonpCallback:'getUsername',
    success:function(){
        onSuccess();
    }
    error:function(){
       onError();
    }
});
function getUsername(data){
    var p = document.createElement('p');
    p.innerText='username: '+data.name;
    document.body.appendChild(p);
}
function onError(){
    alert('连接出错');
}
  • 这种方法的缺点:
    1. 容易被注入恶意代码,解决方案是服务器端加入字符串过滤
    2. 一般需要token验证,不让第三方访问
    3. 只能发送GET请求

第三种:CORS方法

CORS方法是在服务器对接受的来源域进行设置。Access-Control-Allow-Origin可以指定接受请求的具体域名,也可也设置为*表示所有源的请求都可以

//CORS方法,2.georgema.applinzi.com发送post请求
    $.ajax({
        url:'//1.georgema.applinzi.com/test.php',
          type:'POST',
          data:'georgema',
          error:function(){
            alert('连接错误!');
         },
         success:function(res){
            alert(res);
        }
    });

//1.georgema.applinzi.com/test.php
<?php 
header('Access-Control-Allow-Origin:http://2.georgema.applinzi.com'); //加这一句可以接收指定源的请求
  echo 'hello'; 
?>
0_1466859081679_cors.png

0_1466859102371_cors2.png
  • 这种方法的缺点:
  1. 现代浏览器支持比较好,老版本浏览器不支持
  2. 需要后端支持

以上内容参考饥人谷教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • 1.什么是同源策略 1.要了解同源策略,我们必须先知道源即orgin 以百度页面为例,谷歌浏览器打开控制台:输入l...
    GarenWang阅读 1,401评论 2 8
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    w_zhuan阅读 485评论 0 0
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    他在发呆阅读 812评论 0 0
  • 我没有前男友 我向往爱情 我害怕改变 舍不得一个人看书 想发呆就发呆 舍不得一个人吃饭 想点什么就什么 舍不得一个...
    梅井阅读 144评论 0 1
  • 敲一手烂代码阅读 436评论 0 0