JavaScript跨域方法学习总结

JavaScript跨域:

URL

说明

是否允许通信

http://www.a.com/a.js 
http://www.a.com/b.js

同一域名下

允许

http://www.a.com/lab/a.js 
http://www.a.com/script/b.js

同一域名下不同文件夹

允许

http://www.a.com:8000/a.js 
http://www.a.com/b.js

同一域名,不同端口

不允许

http://www.a.com/a.js 
https://www.a.com/b.js

同一域名,不同协议

不允许

http://www.a.com/a.js 
http://70.32.92.74/b.js

域名和域名对应ip

不允许

http://www.a.com/a.js 
http://script.a.com/b.js

主域相同,子域不同

不允许

http://www.a.com/a.js 
http://a.com/b.js

同一域名,不同二级域名(同上)

不允许(cookie这种情况下也不允许访问)

http://www.cnblogs.com/a.js 
http://www.a.com/b.js

不同域名

不允许

JavaScript请求了不属于自己所在域的资源,违背同源策略,产生跨域。

(1)协议不同,比如http和https。

(2)域名或ip不同。

(3)端口不同。

跨域解决方案:

1、script标签跨域方案。

Script标签并无同域策略限制,是可以跨域获取脚本文件的。

客户端代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title></title>

<script type="text/javascript">

var result = null;

window.onload = function () {

var script = document.createElement("script");

script.type = "text/javascript";

script.src=\‘#\‘" //192.168.0.101/ExampleBusinessApplication.Web/web2.aspx";

var head = document.getElementsByTagName("head")[0];

head.insertBefore(script, head.firstChild);

};

function callback(data) {

result = data;

}

function b_click() {

alert(result.name);

}

</script>

</head>

<body>

<input type="button" value="click me!" onclick="b_click();" />

</body>

</html>

服务端代码:

protected void Page_Load(object sender, EventArgs e)

{

string result = "callback({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

Response.Clear();

Response.Write(result);

Response.End();

}

2、jsonp跨域方案。

Jsonp的实现原理即是script标签跨域方式。

Jsonp跨域的服务端和script标签跨域是一样的,都要用callback(+data+)格式返回数据;

服务端代码:

protected void Page_Load(object sender, EventArgs e)

{

string callback = Request.QueryString["jsoncallback"];//从请求头中获取callback方法名

string result = callback + "({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

Response.Clear();

Response.Write(result);

Response.End();

}

客户端代码:

$.ajax({

async: false,

url: "http://192.168.0.5/Web/web1.aspx",

type: "GET",

dataType: ‘jsonp‘,

//jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象.

jsonp: ‘jsoncallback‘,

//要传递的参数,没有传参时,也一定要写上

data: null,

timeout: 5000,

//返回Json类型

contentType: "application/json;utf-8",

//服务器段返回的对象包含name,data属性.

success: function (result) {

alert(result.date);

},

error: function (jqXHR, textStatus, errorThrown) {

alert(textStatus);

}

});

3、document.domain跨子域方案。

所谓跨子域,就是通过设置document.domain将两个不同域的资源放在同一个父域下面,然后两者就可以正常交互了。

A页面代码(http://www.example.com/a.html):

<html>

<head>

<script>

document.domain = "example.com";

function aa(){

alert("p");

}

</script>

</head>

<body>

<iframe src=\‘#\‘" //example.com/b.html" id=”i”>

</iframe>

<script>

document.getElementById(‘i‘).onload = function(){

var d = document.getElementById(‘i‘).contentWindow;

d.a();

};

</script>

</body>

</html>

B页面代码(http://example.com/b.html):

<html>

<head>

<script>

document.domain = " example.com";

function a(){

alert("c");

}

</script>

</head>

<body>

</body>

</html>

注意:document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:www.org.example.com 中某个文档的document.domain 可以设成www.org.example.com、org.example.com 、example.com中的任意一个,但是不可以设成 ftp.www.org.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。

注意:document.domain的跨域必须是依托于一个html通过iframe的代理链接到另一个html,如果是ajax直接访问,这是行不通的。

主页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

<title>跨域获取数据</title>

<script type="text/javascript">

function domainData(url, fn)

{

var isFirst = true;

var iframe = document.createElement(‘iframe‘);

iframe.style.display = ‘none‘;

var loadfn = function(){

if(isFirst){

iframe.contentWindow.location = ‘http://a.com/null.html‘;

//动态生成iframe载入a页面。

isFirst = false;

} else {

fn(iframe.contentWindow.name);

iframe.contentWindow.document.write(‘‘);

iframe.contentWindow.close();

document.body.removeChild(iframe);

iframe.src = ‘‘;

iframe = null;

}

};

iframe.src = url;

if(iframe.attachEvent){

iframe.attachEvent(‘onload‘, loadfn);

} else {

iframe.onload = loadfn;

}

document.body.appendChild(iframe);

}

</script>

</head>

<body>

</body>

<script type="text/javascript">

domainData(‘http://b.com/data.html‘, function(data){

alert(data);

});

</script>

</html>

B页面代码:

<script>

window.name = ‘需要跨域传递的数据‘;

</script>

4、window.name跨域方案。

Window的name属性存在于一个窗口的生命周期内,即使用window.location载入的界面都会共享这个name属性,且不会重置。

因此,可以我们可以通过这个name属性传递想要的数据。

主页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

<title>跨域获取数据</title>

<script type="text/javascript">

function domainData(url, fn)

{

var isFirst = true;

var iframe = document.createElement(‘iframe‘);

iframe.style.display = ‘none‘;

var loadfn = function(){

if(isFirst){

iframe.contentWindow.location = ‘http://a.com/null.html‘;

//动态生成iframe载入a页面。

isFirst = false;

} else {

fn(iframe.contentWindow.name);

iframe.contentWindow.document.write(‘‘);

iframe.contentWindow.close();

document.body.removeChild(iframe);

iframe.src = ‘‘;

iframe = null;

}

};

iframe.src = url;

if(iframe.attachEvent){//判断是否为IE浏览器,因为IE支持attachEvent

iframe.attachEvent(‘onload‘, loadfn);

} else {

iframe.onload = loadfn;

}

document.body.appendChild(iframe);

}

</script>

</head>

<body>

</body>

<script type="text/javascript">

domainData(‘http://b.com/data.html‘, function(data){

alert(data);

});

</script>

</html>

B页面代码:

<script>

window.name = ‘需要跨域传递的数据‘;

</script>

5、HTML5的window.postMessage跨域方案。

A页面代码:

<script>

function onLoad(){

var iframe=document.getElementById(‘iframe’);

var win=iframe.contentWindow;

win.postMessage(“你好”,*);//第一个参数为需要传递的消息,第二个为接收消息的域,可以为通配符。

}

</script>

B页面代码:

<script>

Window.onmessage=function(e){//注册事件接收消息;

e=e||event;//获取时间对象

alert(e.data);

}

</script>

6、cors跨域方案。

在服务器为response响应头添加跨域许可,可以使用通配符“*”。

(跨域请求可以是post方式或者get方式请求。)

服务端:

header("Access-Control-Allow-Origin: http://www.a.com");

客户端代码:

$.ajax("www.cros.com/api/data", {

type: "GET",

xhrFields: {

withCredentials: true

},

crossDomain: true,

success: function(data, status, xhr) {

}

});

本篇主要为摘抄和收集。

参考文档:

http://www.cnblogs.com/oneword/archive/2012/12/03/2799443.html

http://www.cnblogs.com/zjfree/archive/2011/02/24/1963591.html

http://narutolby.iteye.com/blog/1464436

http://www.cnblogs.com/2050/p/3191744.html

时间: 2024-10-08 16:15:57

JavaScript跨域方法学习总结的相关文章

javascript 中几种实用的跨域方法原理详解(转)

原文:http://blog.csdn.net/primary_wind/article/details/40062985 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对http://store.company.com/dir/page.html同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 一.

JavaScript 跨域漫游

前言: 最近在公司做了几个项目都涉及到了iframe,也就是在这些iframe多次嵌套的项目中,我发现之前对iframe的认识还是比较不足的,所以就静下心来,好好整理总结了iframe的相关知识:<Iframe 功能详解>. 在做公司项目的过程中,让我纠结之一的就是iframe的跨域问题,在网上查到的资料,基本都是给个思路,加个DEMO,也没有完整的解决方案.所以这里我结合公司的项目实际需求,从新整理了一下javaScript跨域的相关方法. PS:请转载的童鞋,请注明出处 ... 目录: 一

常用跨域方法实践(一)

这几天看了鬼道师兄的<跨终端Web>这本书,该书从解决实际业务出发,讲述了跨终端的优势与未来,受益良多.其中,书中第九章介绍了作者在阿里内部的一个参赛作品Storage,该作品巧妙的使用了跨域知识,让我见识到跨域其实不仅仅是JSONP.以前,对前端跨域这块或多或少有点了解,但真正动手实践的不是很多.于是,这段时间我好好整理了常用跨域方法的具体实现.本文,主要介绍了JSONP和CORS的实现方式. 相关概念: 只要协议.域名.端口有任何一个不同,都被当作是不同的域 JavaScript出于安全方

JavaScript跨域

JavaScript跨域 js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同.这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作. URL 说明 是否允许通信 http://www.a.com/a.jsh

js跨域方法

JavaScript跨域总结与解决办法 什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用HTML5 postMessage 6.利用flash 本文来自网络(http://f2e.me/200904/cross-scripting/,该网址已不能访问),仅作个人读书笔记之用,并稍作修改和补充. 什么是跨域 JavaScript出于安全方面的考虑,不

JavaScript跨域总结与解决办法

JavaScript跨域总结与解决办法(转) 什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用HTML5 postMessage 6.利用flash 本文来自网络(http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html). 什么是跨域 JavaScript出于安全方面的考虑,不允

js day44 Jquery(筛选,事件,效果,Ajax,javascript跨域)

1     筛选[掌握]     筛选与之前"选择器"雷同,筛选提供函数 1.1   过滤 eq(index|-index),获取第N个元素 ?index:一个整数,指示元素基于0的位置,这个元素的位置是从0算起. ?-index:一个整数,指示元素的位置,从集合中的最后一个元素开始倒数.(1算起) first(),获取第一个元素 last(),获取最后个元素 hasClass(class),检查当前的元素是否含有某个特定的类,如果有,则返回true. filter(exp

javascript跨域访问探索之旅

需求: 最近工作负责一个互联网应用A(我公司应用)与另一个互联网应用B进行通讯,通讯的方式是这样的:另一个互联网应用某些表单信息需要从我公司的互联网应用获取:首先用户访问互联网应用B,接着在表单编辑页面点击按钮创建新窗口显示互联网应用A内容,用户在应用A窗口选取好内容后点击按钮,应用A的窗口关闭,应用A选取好的内容填充到应用B特定的表单元素上. 这个问题最简化描述就是,浏览器有两个不同网站(域)的页面,页面B需要获取页面A的信息. 问题解决过程: 刚开始我也不知道这个是跨域问题,虽然同事一开始就

深入理解前端跨域方法和原理

前言 受浏览器同源策略的限制,本域的js不能操作其他域的页面对象(比如DOM).但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.所以我们要通过一些方法使本域的js能够操作其他域的页面对象或者使其他域的js能操作本域的页面对象(iframe之间). 这里需要明确的一点是:所谓的域跟js的存放服务器没有关系,比如baidu.com的页面加载了google.com的js,那么此js的所在域是baidu.com而不是google.com.也就是说,此时该js能操作baidu.co