Javascript
Cross-domain
最近项目中碰到了
IFrame
引入外域页面,设置自由高度无效的情况,此问题涉及到
JS
跨域问题。借此总结一下相关知识。
跨域
:
sometimes we make cross-domain requests, which would usually be
prohibited due to the same-domain-policy, javascript same-domain policy
prohibit reading of html dom's property at one domain from a different domain.
(由于
JavaScript
同源策略的限制,我们无法跨域调用其他页面的
Dom
对象)。
同源策略:
同源策略,它是由 Netscape 提出的一个著名的安全策略,现在所有的可支持 javascript 的浏览器都会使用这个策略。 所谓同源是指,域名,协议,端口相同。
为什么需要同源策略,这里举个例子:
假设现在没有同源策略,会发生什么事情呢?大家知道, JavaScript 可以做很多东西,比如:读取 / 修改网页中某个值。恩,你现在打开了浏览器,在一 个 tab 窗口中打开了银行网站,在另外一个 tab 窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的 JavaScript ,当你访问 这个恶意网站并且执行它 JavaScript 时,你的银行页面就会被这个 JavaScript 修改,后果会非常严重!而同源策略就为了防止这种事情发生 .
比如说,浏览器的两个 tab 页中分别打开了 http://www.baidu.com/index.html 和 http: //www.google.com/index.html ,其中, JavaScript1 和 JavaScript3 是属于百度的脚本,而 JavaScript2 是属于谷歌的脚本,当浏览器的 tab1 要运行一个脚本时,便会进行同源检查,只有和 www.baidu.com 同源的脚本才能被执行, tab1 只能执行 JavaScript1 和 JavaScript3 脚本,而 JavaScript2 不能 执行,从而防止其他网页对本网页的非法篡改。
不同环境下的交互情况:
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:8089/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
|
不同域名
|
不允许
|
解决方案一,加个代理服务
Web
页面向它源自的 Web
服务器请求数据,并且让 Web
服务器像代理一样将请求转发给真正的第三方服务器。
《
JavaScript: Use a Web Proxy for
Cross-Domain XMLHttpRequest Calls
》
解决方案二
插入动态脚本
(
JSONP
)
SONP
即
JSON with Padding
。由于同源策略的限制,
XmlHttpRequest
只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用
html
的
script
标记来进行跨域请求,并在响应中返回要执行的
script
代码,其中可以直接使用
JSON
传递
javascript
对象。这种跨域的通讯方式称为
JSONP
。我们可以简单这样理解:
JSONP
就是可以通过
JavaScript
文件进行跨域通讯的方式
JSONP
实例
我们可以首先定义一个函数来执行
JSONP
返回的数据,然后通过
JSONP
的
src
传此函数给后台,进行处理,返回可执行的函数。例如下面代码:
function jsonpCallback (a){
alert(a);
}
var JSONP = document.createElement("script") ;
JSONP.type = "text/javascript";
JSONP.src = "http://js8.in/jsonp.php?callback=jsonpHandle";
//在head之后添加js文件
document.getElementsByTagName("head")[0].appendChild(JSONP);
url
是跨域服务器取
json
数据的接口,参数为回调函数的名字,返回的格式为
:
jsonpCallback({msg:'this is json data'})
Jsonp
原理:
首先在客户端注册一个
callback,
然后把
callback
的名字传给服务器。
此时,服务器先生成
json
数据。
然后以
javascript
语法的方式,生成一个
function , function
名字就是传递上来的参数
jsonp.
最后将
json
数据直接以入参的方式,放置到
function
中,这样就生成了一段
js
语法的文档,返回给客户端。
客户端浏览器,解析
script
标签,并执行返回的
javascript
文档,此时数据作为参数,传入到了客户端预先定义好的
callback
函数里
.
(动态执行回调函数)
分享到:
相关推荐
JavaScript跨域通信是Web开发中的一个重要概念,它涉及到浏览器的安全策略和Ajax请求的限制。由于浏览器的同源策略,一个域名下的JavaScript无法直接访问或操作不同域名下的资源,这就需要我们采用特定的方法来实现...
JavaScript跨域和Ajax跨域是Web开发中常见的问题,尤其在进行前后端分离或API调用时,由于浏览器的同源策略限制,不同域名、协议或端口的资源请求会被阻止,这就是所谓的“跨域”。本文将深入探讨JavaScript和Ajax...
JavaScript跨域访问解决方案 在Web开发中,JavaScript的同源策略是浏览器为了保障用户安全而实施的一项重要机制。它限制了脚本只能访问与当前页面具有相同协议(如http或https)、主机名和端口号的资源。然而,在...
JavaScript跨域方案是Web开发中的一个重要主题,尤其是在构建现代Web应用程序时。由于浏览器的安全策略,JavaScript在不同域名之间默认不允许进行通信,这就是所谓的“同源策略”。然而,开发者经常需要在多个域之间...
JavaScript跨域调试是Web开发中的一个关键环节,因为浏览器的安全策略限制了JavaScript在不同源之间的交互。"Javascript Debug Toolkit 1.0.2"是一款专为解决这一问题而设计的强大工具,它允许开发者在跨域环境中...
JavaScript跨域访问是Web开发中的常见挑战,由于浏览器的安全策略——同源策略,JavaScript通常只能访问与当前页面同源(协议、域名、端口都相同)的资源。然而,为了实现不同源之间的通信,开发者可以采取多种方法...
实现javascript跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171
### JavaScript跨域总结与解决办法 #### 跨域的基本概念 跨域问题源自于浏览器的安全策略之一——**同源策略**。同源策略是浏览器为了防止恶意网站通过脚本访问其他网站的数据而采取的一种安全措施。它规定了一个...
JavaScript跨域是Web开发中一个常见的挑战,尤其是在进行Ajax请求或者使用API时。由于浏览器的安全策略,不同源的HTTP请求会被禁止,这就是所谓的"同源策略"。然而,随着Web应用的发展,跨域需求日益增加,Node.js...
本文将深入探讨一个具体的JavaScript跨域请求包装函数,并通过示例来展示其实际应用。 #### 一、理解跨域请求 跨域请求是指在一个域名下的页面发起对另一个域名下的资源的请求。浏览器为了保护用户隐私和数据安全...
JavaScript跨域是Web开发中一个常见的挑战,主要是由于浏览器的安全策略——同源策略(Same-origin policy)限制。同源策略要求网页只能访问与其自身URL协议、域名和端口完全相同的资源,以防止恶意脚本窃取数据。...
JavaScript跨域访问是Web开发中常见的一种挑战,由于浏览器的同源策略限制,一个域上的脚本不能直接获取或操作另一个域上的资源。为了解决这个问题,开发者通常采用以下三种主要方法:1. 基于iframe实现跨域2. JSONP...
【JavaScript跨域调用基于JSON的RESTful API】 在Web开发中,JavaScript是客户端脚本语言,主要用于增强用户界面和实现动态交互。然而,由于浏览器的同源策略(Same Origin Policy),JavaScript在处理AJAX...
JavaScript跨域总结 在Web开发中,由于浏览器的同源策略限制,JavaScript代码通常只能访问与自身页面协议、域名和端口完全相同的资源。这种安全机制是为了防止恶意脚本通过跨站点请求获取用户敏感信息。然而,随着...
### JavaScript父子页面跨域通信详解 #### 一、引言 在现代Web开发中,跨域通信是一个常见的问题。由于浏览器的安全策略——同源策略(Same-origin policy)的存在,JavaScript在处理不同源之间的数据交互时会受到...
JavaScript跨域问题主要源于浏览器的同源策略,这是一种安全机制,限制了JavaScript脚本只能访问与当前页面同协议、同域名、同端口的资源。当尝试从一个域名下的网页去请求另一个域名的数据时,例如通过Ajax进行...
在使用ArcGIS API for JavaScript开发Web应用程序时,经常会遇到跨域问题。这是因为浏览器的安全策略限制了JavaScript从一个源(域名、协议或端口)请求另一个源的数据。ArcGIS API for JavaScript是一个强大的工具...
JavaScript跨域处理是Web开发中的一个关键概念,由于浏览器的安全策略,JavaScript通常被限制在同一源策略下运行,这意味着脚本只能访问与加载它的页面来自同一域名的资源。然而,在实际应用中,为了实现数据交互、...