最近在做项目的时候遇到了JavaScript跨域的问题,JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。网上也有很多解决方案,没有找到适合的解决方法。最后使用了easyXDM解决了我的问题,使用easyXDM时有两个条件:1.浏览器要安装flash插件(具体支持的浏览器在说明文件里说的很清楚)2.要跨域的工程中都要引入easyXDM文件。希望能给需要的同学提供一个解决的方法。
先说一下我的问题,项目涉及到两个工程,部署在不同的服务器上,http://127.0.0.1/a.jsp里嵌入一个iframe,iframe引入了一个http://127.0.xx.xx/b.jsp页面,b.jsp里嵌了一个flex页面,我在b.jsp中有一个表单提交的saveInfo()的js函数,我想在a.jsp里保存时调用saveInfo()。
具体的使用方法在example里都有很好的例子,照着做就可以。要注意引入easyXDM.js和json2.js的引入。
下面是easyXDM的简要说明
http://stackoverflow.com/questions/10928245/cant-access-js-function-in-cross-domain-environment
[This is one of the best and easy to use APIs] available for Cross Domain Communication between web applications. easyXDM is easy to use, light weight, flexible, writing good quality code etc. I strongly think if you are going to continue with cross domain scenario, then you should adapt a robust cross domain apis such as easyXDM.
[easyXDM vs PostMessage Transport?] easyXDM will use the PostMessageTransport method if this feature is enabled by the browser such as (IE8+, Opera 9+, Firefox 3+, Safari 4+,Chrome 2+) on the other side it will use different transport methods for the un supported browsers such as (Firefox 1-2 - using the FrameElementTransport) other transport methods will be used as needed such as FlashTransport, NameTransport, and HashTransport).
This clearly makes easyXDM superior in terms on browser support specially the old browsers.
To demonstrate cross-domain access using easyXDM (Domain1 [abc.com] calls a method on a remote domain [xyz.com]):
<script type="text/javascript"> /** * Request the use of the JSON object */ easyXDM.DomHelper.requiresJSON("../json2.js"); </script> <script type="text/javascript"> var remote; window.onload = function(){ /** * When the window is finished loading start setting up the interface */ remote = new easyXDM.Interface(/** The channel configuration */{ /** * Register the url to hash.html, this must be an absolute path * or a path relative to the root. * @field */ local: "/hash.html", /** * Register the url to the remote interface * @field */ remote: "http://YOUR.OTHER.DOMAIN/YOUR_APPLICATION/YourRemoteApplication.html", /** * Register the DOMElement that the generated IFrame should be inserted into */ container: document.getElementById("embedded") }, /** The interface configuration */ { remote: { remoteApplicationMethod: {}, noOp: { isVoid: true } }, local: { alertMessage: { method: function(msg){ alert(msg); }, isVoid: true } } },/**The onReady handler*/ function(){ /** * Call a method on the other side */ remote.noOp(); }); } function callRemoteApplicationMethod(Value1, Value2){ remote.remoteApplicationMethod(Value1, Value2, function(result){ alert("Results from remote application" + result); }); } </script>
In the body
<input type="button" onclick="callRemoteApplicationMethod(3,5)" value="call remoteApplicationMethod on remote domain"/>
Now on your remote domain side you need to define your remote client as follows
*On Domain [ xyz.com ] - Remote domain*
This should go into the page YOUR_APPLICATION/YourRemoteApplication.html
/** * Request the use of the JSON object */ easyXDM.DomHelper.requiresJSON("../json2.js"); </script> <script type="text/javascript"> var channel, remote; /** * When the window is finished loading start setting up the channel */ window.onload = function(){ /** * When the channel is ready we create the interface */ remote = new easyXDM.Interface(/** The channel configuration*/{}, /** The configuration */ { remote: { alertMessage: { isVoid: true } }, local: { remoteApplicationMethod: { method: doSomething(value1, value2){ // do somethigs with values return "i'm return value from remote domain"; } }, noOp: { isVoid: true, method: function(){ alert("Method not returning any data"); } } } }); }
相关推荐
在JavaScript编程中,跨域(Cross-Origin)是一个常见的问题,特别是在Web开发中,当尝试从一个源(如一个域名、协议或端口)加载资源到另一个源时,浏览器的安全策略通常会阻止这种行为,以防止恶意脚本从不受信任...
在使用ArcGIS API for JavaScript开发Web应用程序时,经常会遇到跨域问题。这是因为浏览器的安全策略限制了JavaScript从一个源(域名、协议或端口)请求另一个源的数据。ArcGIS API for JavaScript是一个强大的工具...
JavaScript跨域和Ajax跨域是Web开发中常见的问题,尤其在进行前后端分离或API调用时,由于浏览器的同源策略限制,不同域名、协议或端口的资源请求会被阻止,这就是所谓的“跨域”。本文将深入探讨JavaScript和Ajax...
JSONP是一种早期解决跨域问题的方式,通过动态创建`<script>`标签来加载指定URL的JavaScript文件。服务器返回的不是JSON数据,而是包含回调函数的JavaScript代码,客户端预先定义好这个回调函数,从而能够处理返回的...
### JavaScript父子页面跨域通信详解 #### 一、引言 在现代Web开发中,跨域通信是一个常见的问题。由于浏览器的安全策略——同源策略(Same-origin policy)的存在,JavaScript在处理不同源之间的数据交互时会受到...
4. WebSocket:WebSocket协议提供全双工、低延迟的双向通信,它在建立连接时就已经解决了跨域问题。服务器只需要在响应头中包含`Sec-WebSocket-Origin`字段,指定允许的源即可。 5. Iframe:通过嵌入一个可跨域的...
在Web开发的浪潮中,JavaScript跨域调试一直是困扰开发者的一个技术难题。由于浏览器的安全策略限制,JavaScript在不同源之间无法自由交互,这给开发者带来了极大的不便,尤其是在涉及到跨域资源共享(CORS)的场景...
这种方式可以避免跨域问题,但增加了网络延迟。 5. WebSocket WebSocket协议支持跨域,可以建立持久化的双向通信连接。创建WebSocket对象时,URL可以是任意源,只要服务器支持WebSocket并允许跨域即可。 6. window...
实现javascript跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171
3. **iframe跨域问题**:当iframe加载的页面与包含它的页面不在同一个域时,就会出现跨域问题,导致无法直接通过JavaScript进行通信,如获取iframe内的内容、设置iframe的属性等。 **二、iframe跨域的解决方案** 1...
javascript 跨域问题以及解决办法 什么是跨域问题? 跨域这个问题是由于浏览器的同源策略引起的,请求的URL地址,必须与浏览器的URL是相同协议、相同域名、相同端口的,否则是不允许访问的 浏览器URL 要访问的...
JavaScript(简称“JS”)是一种高级的、解释型的编程语言。它是一种轻量级,通常用于网页上,实现客户端的脚本编程。虽然JavaScript和Java在名称上相似,但它们是两种完全不同的语言,具有不同的编程范式、语法和...
### JavaScript跨域总结与解决办法 #### 跨域的基本概念 跨域问题源自于浏览器的安全策略之一——**同源策略**。同源策略是浏览器为了防止恶意网站通过脚本访问其他网站的数据而采取的一种安全措施。它规定了一个...
Nginx 跨域问题解决方案 Nginx 是一个流行的开源 Web 服务器软件,广泛应用于 Web 服务器管理。然而,在使用 Nginx 进行服务器管理时,经常会遇到跨域问题。跨域问题是指在不同的域名、端口或协议下,无法访问...
解决arcgis server跨域问题: 1、停掉ArcGIS Server的服务。 2、 打开<ArcGIS Server> \framework\runtime\tomcat\conf\web.xml,注册跨域bean 3、lib下拷贝 cors-filter-2.5.jar java-property-utils-1.9.1.jar包 4...
然而,随着互联网的发展,开发者常常需要在不同源之间共享数据,这就涉及到了JavaScript的跨域问题。本文将对JavaScript跨域进行深入的总结。 1. 同源策略 同源策略是浏览器为了保护用户信息安全而设定的一项机制,...
JavaScript跨域问题,是Web开发中常见的一个挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源的资源,这在实现某些功能时会带来不便。本文将深入探讨JavaScript跨域问题的原因、影响以及多种解决方案...
跨域问题源于浏览器的安全策略,限制了一个源(域名)的JavaScript代码对另一个源发起HTTP请求。为了解决这个问题,我们需要配置Nginx的代理。 1. **编辑Nginx配置** 打开Nginx配置文件,通常是`/etc/nginx/nginx....
JavaScript跨域问题主要源于浏览器的同源策略,这是一种安全机制,限制了JavaScript脚本只能访问与当前页面同协议、同域名、同端口的资源。当尝试从一个域名下的网页去请求另一个域名的数据时,例如通过Ajax进行...