跨域的由来

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但是我们常常会遇到无法避免跨域的情况,如普通文章站点(article.xxx.com)需要评论,而评论站点却在cheat.xxx.com的情况。

跨域限制情况

在不同端口,不同协议,不同域名,域名和域名对应ip,主域相同,子域不同 都会产生同域限制,然而目前前端还无法解决,我们能解决的知识跨父域的情况(如上面说的article.xxx.com取得cheat.xxx.com)。

跨域的方法有很多,本文就谈谈使用window.name跨域

如开头提到的,我们需要在article.xxx.com和cheat.xxx.com跨域

实现原理:

window.name在同个页面间的iframe直接是共用的一个属性,以此为原理,我们就这么做

1、在article.xxx.com的页面中将要传输的数据存储在window.name里面,以及提供回调用的处理函数

2、新建iframe路径指向cheat.xxx.com域名的页面(crossproxy.html),然后在iframe获取window.name中的传输数据,提交给后端(同域传输了,呵呵)

3、iframe 将后端返回的数据存储在window.name里面, 再将此iframe的路径指向article.xxx.com域名的页面(redirect.html)

4、iframe执行父页面的回调函数

准备工作

在cheat.xxx.com建立crossproxy.html作为发数据所用

在article.xxx.com建立redirect.html作为返回回调函数使用

开始写代码了:

在article.xxx.com新建下面的方法

 var crossDomainId = 0; //作为每次不同使用crosspost的标识
/*param包含
@param.action 请求action
@param.param 请求数据
@param.redirUrl iframe重定向的链接
*/
function crosspost (param,cb) {
var g = $('<iframe id='+iframe.crossDomainId+' ></iframe>').appendTo('body').attr('src', 'http://cheat.xxx.com');
var _param = json.JSON.stringify($.extend(true, param, {id:'cb'+crossDomainId})); g[0].contentWindow.name = _param;
window.redirectCallback['cb'+crossDomainId] = function () {
cb&&cb(window.name[data]);
g.remove();
}
crossDomainId++;
}

cheat.xxx.com/crossproxy.html代码

   try{
var data=JSON.parse(window.name),id=data.id,redirUrl=data.redirUrl;
$.post(data.action,data.param,'json').done(function(data){
window.name=JSON.stringify($.extend(true, {data:data}, {id:id})); location.href=redirUrl; }).fail(function(){
window.name=data;
location.href=redirUrl
});
}catch(e){}

article.xxx.com/redirect.html代码

 var data=JSON.parse(window.name);
var id = data[id];
try{
top.redirectCallback(param.id);
}catch(e){ }

优化:

以上代码在crossDomainId和url参数,可以使用location.search在父页面和iframe间传输,可降低window.name的复杂度

原页面使用defferd的写法,在使用的时候能够更加优雅

跨域的方法有很多,之前写过一篇jsonp跨域的文章http://www.cnblogs.com/peace1/p/4517279.html,写的比较简单

window.name 跨域的更多相关文章

  1. JS window.name跨域封装

    JS window.name 跨域封装 function CrossDomainName(target, agent, callback, security) { if (typeof target ...

  2. window.name跨域

    window.name? 每一个页面都有一个自己的window,而window.name是window的名字. window.name跨域原理 window对象有个name属性,该属性有个特征:即在一 ...

  3. window.returnValue跨域传值问题[转]

    主页面用window.showModalDialog的时候,如果直接打开其它系统的页面,这时候别人的页面在window.returnValue=1;这样返回值的时候,主页面是取不到返回值的,原因就是因 ...

  4. HTML5 window/iframe跨域传递消息 API

    原文地址:HTML5′s window.postMessage API 在线示例:Using HTML5's window.postMessage(请打开控制台看日志) 原文日期: 2010年09月0 ...

  5. (二)文档请求不同源之window.name跨域

    一.基本原理 window.name不是一个普通的全局变量,而是当前窗口的名字.这里要注意的是每个iframe都有包裹它的window,而这个window 是top window的子窗口,而它自然也有 ...

  6. (二)文档请求不同源之window.postMessage跨域

    一.基本原理 HTML5为了解决跨域,引入了跨文档通信API(Cross-document messaging).这个API为window对象新增了一个window.postMessage方法,允许跨 ...

  7. window.name跨域实现

    参考:window.name实现的跨域数据传输 有三个页面: a.com/app.html:应用页面. a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面 ...

  8. window.name 跨域数据传输

    通过window.name可以实现跨域数据传输. 要解决的功能:  www.a.com/a.html 需要获取到 www.b.com/b.html页面内容的数据 需要3个页面 www.a.com/a. ...

  9. HTML5之worker开启JS多线程模式及window.postMessage跨域

    worker概述 worker基本使用 window下的postMessage worker多线程的应用 一.worker概述 web worker实际上是开启js异步执行的一种方式.在html5之前 ...

随机推荐

  1. Keil4 每次选build 编译(F7)都全部编译的解决办法

    Keil4 每次选build 编译(F7)都全部编译的解决办法 http://blog.csdn.net/wchengshen/article/details/50440079 Keil4 每次选bu ...

  2. c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象

    基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.

  3. [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

    题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535     Descripti ...

  4. OpenSSL命令---rand

    用途: 用来产生伪随机字节.随机数字产生器需要一个seed,先已经说过了,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件.如果该程序能让随机数字产生器很满意的被seeded ...

  5. Java Pattern Matcher 正则应用

    转自:http://www.itzhai.com/java-notes-regex-matches-and-lookingat.html#read-more 1.基本语法 2.String内建的正则表 ...

  6. access数据库

    //访问动态创建access数据库 string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.M ...

  7. Vedis - An Embeddable Datastore Engine

    Vedis - An Embeddable Datastore Engine     An Embeddable Datastore Engine         Tweet        Follo ...

  8. 构件图(Component Diagram)—UML图(八)

    构件图是显示代码自身结构的实现级别的图表.构件图由诸如源码文件.二进制代码文件.可运行文件或动态链接库 (DLL) 这种构件构成,并通过依赖关系相连接 以下这张图介绍了构件图的基本内容: 以下这张图是 ...

  9. Column store index 列数据如何匹配成行数据?

    SQL Server 2012引入了列存储索引,对每列的数据进行分组和存储,然后联接所有列以完成整个索引.这不同于传统索引,传统索引对每行的数据进行分组和存储,然后联接所有行以完成整个索引. 在访问基 ...

  10. activity入门

    1.前单文件 <activity android:name="com.example.twoactivity.OtherScreenActivity" android:lab ...