admin 管理员组

文章数量: 1184232


2024年4月13日发(作者:律师事务所简介)

第29卷 

第22期 

V01.29 NO.22 

计算机工程与设计 

Computer Engineering and Design 

2008年l1月 

NOV.2008 

AJAx跨域访问的研究与应用 

陈腊梅 , 李 为 , 程振林 , 张晓力 

(1.华北电力大学计算机科学与技术学院,北京102206;2.中国科学院计算技术研究所,北京100080) 

摘 要:在异域数据集成的Web应用中,同源策略使AJAX跨域访问受到了限制。阐述了AJAx工作原理进而说明了同源策 

略如何影响AJX跨域访问,分析了当前避开同源策略的主要方案,提出了XMLHTTP代A

访问和展现数据的问题。 

+JSON技术的解决方法,最后介 

绍了该方法在“科技基础条件平台异地软件共享系统”的应用。项目开发的实践结果表明,该方法有效地解决了AJAx跨域 

关键词:AJAX;同源策略;跨域访问;XMLHTTP代理;JSON 

中图法分类号:TP311.52 文献标识码:A 文章编号:1000.7024(2008)22—5680—05 

Research and application of AJAX cross—domain access 

CHEN La—mei .LI Wlei 。 CHENG Zhen.1in2. ZHANG Xiao—li 

(1.School ofComputer Science and Technology,North China Electric Power University,Beijing 102206,China; 

2.Institute of Computing Technology,Chinese Academy of Sciences,Beijing 1 00080,China) 

Abstract:AJAX cross-domain accesses are limited by same origin policy in the web applications of data integration between different 

domains.The operating principles of AJAX are explained and the way how salne origin policy affects AJAX cross—domain accesses is 

illustrated.Major solutions to avoiding same origin policy are analyzed and the method ofXMLHTTP proxy and JSON technique is brou・ 

ght forward.At last,the application of this method in‘'the system of software sharing between diferent areas based on science and 

tecnolhogy basic platform'’is introduced.Practice in the project development approves that this method can effectively solve the problem 

of AJAX cross.domain access and data exhibition. 

Key words:AJAX;same origin policy;cross—domain access;XMLHTTP proxy;JSON 

0引 言 

传统的Web应用采用同步交互过程,在这种情况下,用 

户首先向服务器发送一个HTTP请求,服务器执行某些任务 

再向用户返回一个HTTP响应。服务器在处理请求(特别是负 

载比较大)的时候,用户大多数时间处于等待状态,屏幕内容 

是一片空白。这是一种不连贯的用户体验。与传统Web应用 

不同,AJX(Aasynchronous JavaScriptandxML)技术具备与服务 

器异步通信的能力,它允许Web页面内容快速更新而无需刷 

HttpRequest是一个API,它允许客户端的JavaScript与远程服 

务器建立HTTP连接和交换数据,比如纯文本、XML和JSON 

(JavaScript object notation); 

(4)使用JavaScript绑定一切。 

在AJAx中,客户端JavaScript通过动态修改DOM树和 

CSS来更新Web页面,异步通信使用XMLHttpRequest对象动 

态地更新数据而无需重新加载整个Web页面。 

AJAx的异步刷新能力使异域的多个内容或服务集成到 

单一的Web应用成为可能,这种聚集更将大大地丰富用户体 

验。然而从有JavaScript脚本开始,同源策略就是Web应用浏 

览器端最为重要的安全保障策略,它使任何JavaScript脚本都 

不能访问异域HTML中任何信息。 

针对同源策略的限制,本文浅析了按需方式、使用 

新页面,使用户从请求/响应的循环中解放出来。 

AJX构建于动态HTML/ADHTML技术之上,包括如下常 

见技术: 

(1)基于XHTML和CSS标准的表示; 

(2)使用DOM(documentobjectmode)进行动态显示和交互; 

(3)使用XMLHttpRequest通过异步方式获取数据:XML. 

收稿日期:2007-11-23 E—mail:cyshmily0110@163.tom 

基金项目:国家科技基础条件平台基金项目(2o05DKA3900)。 

IFRAME方式,重点介绍了XMLHTTP代理+JSON的方法,并 

将此方法应用于项目中。 

作者简介:陈腊梅(1981一),女,山西霍州人,硕士研究生,研究方向为Web开发与应用; 李为(1964一),女,辽宁沈阳人,硕士,副教授, 

研究方向为计算机网络及应用; 程振林(1977一),男,山东莱州人,博士,研究方向为计算机应用、并行处理; 张晓力(1982一),女,河北 

邢台人,硕士,研究方向为Web开发与应用。 

———

5680・—— 

1 AJAX工作原理 

图1是传统Web应用的同步交互过程和AJAx的异步交 

互过程的比较图。 

\ / \ / 

客户端页面、 1调田 2发出 

匦 里.壑: 求 

调函数J ; 

4显示I旦塑里苎J;3返回 

数据 :数据 

在传统Web应用模式中,用户通过界面动作触发一个连 

接到Web服务器的HTTP请求。服务器完成一些处理——接 

收数据、处理计算、再访问其它的数据系统,最后返回一个 

:页面显示 . f aVasoript: ̄.---- 

HTML页面到客户端。这是一种“点击.>等待.>看到新的页 

面.>再点击一>再等待”的割裂的用户体验。AJAX技术采用异 

步的方式实现用户与程序的交互,这样大部分计算工作都是 

在用户无察觉的情况下,交由服务器去完成的,用户无须等待 

服务器的通讯便能继续浏览页面。这种方式大大地改善了用 

户体验。 

图2 AJAX的工作过程 

同源策略,即一个脚本只能读取与它同源的窗口或文档 

的属性,这里的“源”是指域名、端口或者协议。该机制将来自 

不同域(假设域代表始发者)的Web应用程序分离开来,也就 

是说,如果多个窗口或框架中的一些应用程序是从不同的服 

务器下载的,那么它们无法相互访问数据和脚本,浏览器的脚 

AJAX的工作原理是在用户和服务器之间加了一个中间 

层——AJAX引擎。通常要产生一个HTTP请求的用户动作 

现在通过JavaScript调用AJAX引擎来代替。任何用户动作的 

响应不再要求直接传到服务器——例如简单的数据校验、一 

些页面导航——引擎自己就可以处理它。 

图2说明了AJAX的工作过程。当用户访问采用AJX A

本只被允许访问来自同一站点的资源。例如,若一个脚本的 

源端口是80并且协议是HTTP,那么就不能操作源为端口21 

及FTP协议的文档。 

为了进一步说明,表1给出了 AJX.Atom域名下的 

技术构建的Web应用程序触发事件时,程序调用JavaScript事 

件处理函数。在这个函数中,JavaScript利用XMLHttpRequest 

对象实例向服务器发送请求信息,同时指定回调函数。信息 

发送之后,XMLHttpRequest判断HTTP请求的状态。当服务器 

完成数据处理并成功返回信息之后,在回调函数中用对返回 

的XML文档信息或文本信息进行相应处理,并更新HTML页 

面内容。 

比较示例。 

表1 同源策略限制跨域访问示例 

URL 

http://www.AJAX.com/dir2/other.html 

http://www.AJAX.com/dir/inner/other.htm 

https://www.AJAX.com/dir2/other.html 

http://news.AJAX.com/dir2/other.html 

http://www.AJAX.com:81/dir2/other.htm 

度量结果 

成功 

成功 

失败 

失败 

失败 

协议不同 

主机不同 

端口不同 

原因 

2同源策略对AJAX的影响 

运行AJAX应用程序的核心代码是JavaScript。由于In— 

temet完全开放的性质,引入JavaScript这样的语言,安全显得 

尤为重要。JavaScript抵御恶意代码的第一道防线是它本身不 

支持某些功能…。例如,客户端JavaScript没有提供在客户的 

计算机上写文件、删除文件或者创建目录等方法。其中,最重 

要的安全限制是同源策略。 

同源策略的精髓很简单:它认为来自任何站点装载的信 

赖内容是不安全的,其目的在于防止某个文档或者脚本从多 

个不同“origin”(源)装载。当来自多个始发源的内容以某种 

方式被集成到一个单一的应用程序中时,一些内容相互之间 

可能具有不同的信任级别,或者它们可能根本没有必要相互 

信任。同源策略满足了这种需求,它把来自不同始发者的内 

容分离开来,将它们之间的冲突减至最少。这种策略给Ja- 

vaScript以安全保障,同时也限制了基于JavaScript的跨域访 

问技术。 

同源策略是对于客户端脚本(尤其是JavaScript)的重要安 

全度量标准。它首先出自NetscapeNavigator2.0,之后历经Navi- 

gator2.01和Navigator2.02的修正完善 。 

图l传统Web应用的同步交互过程和AJAX的异步交互过程的比较 

5681— 

3 AJAX跨域访问 

AJAX跨域访问是指利用AJAX,在不同域的Web页面间 

相互操作,实现一个对用户来说“无缝”的应用。同源策略的 

目的是控制应用程序与远程服务器的交互。要想实现AJAX 

的跨域访问,必须绕过同源策略的限制。避开同源策略主要 

有以下两种方式。 

3.1避开同源策略:按需方式 

按需方式是指使用JavaScript脚本在页面内动态生成 

<script>标记,将其src属性指向异域以完成对跨域页面的调 

用。核心代码如下: 

(1)function loadContent0 

(2){ 

(3) var S=document.createElement(’SCRIPT”); 

(4) s.src=’http://www.anotherdomain.corn(/TestCrossDo— 

mine.html?f=setDivContent’: 

(5)document.body.appendChild(s); 

(6)) 

(7) 

(8)function setDivContent(v) 

(9){ 

(10)var showDataResult=document.getElementByld(”show— 

DataResult”); 

(1 1) showDataResult.innerHTML:v; 

} 

当用户触发loadContent事件时,JavaScript脚本动态控制 

生成一个新的script标签(行(3)),此时页面开始下载src所指 

向的‘http:llwww.anotherdomain.com/TestCrossDomine.html’,结 

束时回调其中的setDivContent(行(4)),从而更新网页上一个 

div:id=‘showDataResult’的内容(行(10)、行(11))。在这里有一 

点必须注意:src属性所指异域的返回内容必须是合法的Java— 

Script脚本。 

此方案存在的缺陷是:script的src属性完成该调用时采 

取的方式是‘get’,如果请求时传递的字符串过大时,可能会无 

法正常运行。这种方法较适合聚合类门户使用。 

3.2避开同源策略:使用IFRAME 

使用IFRAME是指设置一个带有框架的子域页面,即在 

级域页面中内嵌一个或者多个IFRAME,内嵌的IFRAME为 

子域,设置子域的document.domain和一级域相同。然后在不 

同予域名的页面发起不同的请求,把结果通过JavaScript进行 

传递即可。 

使用IFRAME这种方式能够获取数据来显示,但由于在 

跨域访问的情况下,父窗口与子窗口的交互被拒绝,它的应用 

受到了限制。 

4 XMLHTTP代理+JSON实现AJAX跨域访问 

XMLHTTP代理是指在本域与异域通讯时加一中间层, 

由它向异域服务器进行读取数据的操作。图3为XMLHTTP 

代理。这种代理机制通过调解Web浏览器和服务器之间的 

HTTP请求和响应使Web浏览器可以绕过同源策略。这一中 

・——

5682-—— 

图3 XMLHTTP代理 

间层可以使用PHP、JSP、ASP、Servlet等任何具备网络通讯功 

能的语言。 

使用一个服务器端代理,浏览器可以将请求发给Web服 

务器。Web服务器与外部Web服务器联系,以请求适当的信 

息。当Web服务器收到响应时,把响应转发给浏览器。其结 

果就是外部数据可以进行无缝传输。 

XMLHTTP代理方式的AJAX跨域访问如图4所示。客 

户端Web应用程序将第三方URL作为HTTP请求中的一个 

请求参数传递给AJAX代理;代理将请求转发给要访问的异 

域。异域进行业务处理后,把处理结果返回给XMLHTTP代 

理。XMLHTTP代理获得数据后,剩下要完成的工作就和 

AJAX通常的工作过程相一致。由此看,XMLHTTP代理的使 

用隐藏在Web应用程序开发人员所开发的后台程序中。对 

于Web应用程序开发人员而言,它看上去可能完全不具有同 

源策略。 

@ @ ① 

r客户

l触发事件 

端页面、 )\ 2发出 /XM

lA接受参数 

LHTTP代 

2指定【旦I I + 

调函数 

/—— —_、 

B从参数中 

获得异域 业务处理 

:页面显示 ~ —

6昂示 调函数J

—、JJavaScript ̄ 

数据 

 5返回 

— / 

数据 I 

的uRL 

I异域C连接

’ 

URL l

l 

 

’ 

ID获得数据l  :

数据 

图4 XMLHTTP代理工作原理 

下面给出设有XMLHTTP代理的AJAX工作过程示例程 

序。示例程序分别为客户端、中间层以及异域的核心代码,其 

中中间层为Servlet。 

在Client端,将常用的url=“ProcessServlet”修改为如下 

代码: 

url=“ProxyServlet?url=”+url 

这样就把以异域url为参数的字符串传给了XMLHTTP 

代理。 

在中间层,XMLHTTP代理为一个servlet类,本例中将其 

定义为ProxyServlet。代码如下所示: 

(1)public class ProxyServlet extends HttpServlet{ 

(2) 

(3)protected void service(HttpServletRequest req,HttpSe— 

vrletResponse resp) 

(4)throws ServletException,IOException{ 

(5) 

(6) 

URL url=new URL(req.getParameter(“url”)): 

(7) 

(8) 

DatalnputStream dis=new DatalnputStream(ur1.open一 

字节数比较可以发现,对于等效的JSON和XML有效负载,前 

者总是小于后者。 

下面是JSON数据格式的示例代码: 

(1){‘‘addressbook”:{“name”:“Mary Lebow”, 

Stream()); 

【9) String line; 

(10)PrintWriter pw=resp.getWriter0; 

(11) while((1ine=dis.readLine0)!=nul1){ 

(12)pw.pfintln(1ine); 

(13) } 

(14)} 

(15)} 

在这段示例代码中,pw是PrintWriter的一个实例,它用来 

输入从DatalnputStream读到的数据。URL的对象url指向异 

域(通过客户端传来的参数获得),它通过调用openStream方法 

打开了一个指向异域的连接,并且将从此连接中读取到的输 

入流返回给DatalnputStream的实例。由此可知,XMLHTTP代 

理的主要作用有两点: 

(1)打开指向异域的连接; 

(2)获得连接中的数据。 

远程服务器上的业务处理类也为servelet类,其核心代码 

如下所示: 

(1)public class ProcessServlet extends HttrlServlet{ 

(2) 

(3)protected void service(HapServletRequest req,HttpSe— 

rvletResponse resp) 

(4)throws ServletException,IOException{ 

(5) 

(6) 业务处理过程 

(7) … 

(8) String responseText=处理结果数据; 

(9) resp.getWriter0.print(responseText); 

(10) } 

(11)} 

这段代码主要是将业务处理的结果数据responseText传 

给中间层代码中的line变量。最后,回调函数将得到的数据 

显示在客户端页面。 

通常在AJAX应用程序中,XML作为数据传输的媒介 。 

服务器将响应数据以XML文档方式返回给浏览器客户端。通 

过DOM技术,这些返回的XML文档能够得到准确的解析。 

采用DOM的复杂性源于其基于函数的根,这使得对数据树的 

简单修改或访问都需要进行无数次方法调用 。 

DOM在各种浏览器中的实现细节不尽相同,这一过程将 

带来极为复杂的编程模式,其跨浏览器兼容性出现问题的可 

能性极大。 

JSON是一种轻量级的数据交换格式 。它不仅减少解析 

XML带来的性能问题和兼容性问题,而且与JavaScript引擎自 

然匹配。 

JSON的另一个优点是它的非冗长性。目前还没有正式 

的研究表明比XML有更高的线上传输效率;不过通过简单的 

(2) “address”:{ 

(3) “street”:“5 Main Street” 

(4) “city”:“BeiJing,CHINA”, 

(5) “zip”:102206, 

(6) }, 

(7) “phoneNumbers”:[ 

(8) “619 332—3452”, 

(9) “664 223.4667” 

(10) ] 

(11) } 

(12)} 

使用JavaScript访问JSON中的名称:addressbook.name;访 

问JSON中的地址:addressbook.address.srteet;访问JSON中的 

电话号码第一位:addressbook.address.phoneNumbers[0】。 

JSON开创一条比DOM技术更为便捷的数据访问途径。 

XMLHTTP代理+JSON避开了同源策略的限制,使AJAX跨域 

数据传输更具高效性和稳定性。 

5 XMLHTTP代理+JSON方式在异地软件共享 

系统中的应用 

“科技基础条件平台异地软件共享系统”(以后称“项目”) 

包括两类Web应用:“注册中心”Web应用(以后称“注册中心 

应用”)和“共享程序发布方”Web应用(以后称“发布方应用”)。 

其中,发布方应用运行在共享软件提供商(以后称“提供商”)的 

服务器上,而注册中心应用运行在管理中心(以后称“注册中 

心”)的服务器上。图5描述了项目中AJAX跨域访问的场景: 

提供商使用独立的发布方应用系统在线发布应用软件以共 

享,注册中心对所有提供商发布的共享软件进行实时地统计 

和操作。 

提供商1 

发布 

注册中心应用 

/ 

URL 

援 I三篮 

应用程序11 

应用程序12 

应用程序1n 

应用程序21 

鍪 主\册中心跨域访问 兰(URL 2:) 一

提供商2 

发布 

应用程序22 

厂————]/I 用 厅22

 

 

/ 

应用程序2n 

应用程序nl 

应用程序n2 

提供商n 

发布 

应用程序an 

一 

应用程序nn 

图5项目中AJAX跨域访问的场景 

-——

5683-—— 

图6细化了项目中使用XMLHTTP代理与JSON实现 

AJAX跨域访问的细节。现说明如下: 

(1)用户访问注册中心应用程序的触发事件时,调用Java— 

Script处理函数。此函数完成两项任务:①向XMLHTTP代理 

AJAX的核心,同源策略对JavaScript的影响同时限制了AJAX 

跨域访问。 

本文说明了如何避开同源策略的限制,并结合实例介绍 

了XMLHTTP代理+JSON方法。实践证明该法大大提高了数 

据解析和传输效率,有效地解决了该项目中访问并展现多 

“源”数据的问题,使用户更具交互性的体验。 

发出HTTP请求;②指定回调函数。在向XMLHTTP代理发出 

HTTP请求时,把各个发布方应用中的处理类的URL作为参 

数一同传递过去; 

(2)xMLHTTP代理根据获得的参数解析出不同的URL, 

同时打开与不同URL的连接; 

(3)提供商通过发布方应用共享软件,发布方应用对所有 

已发布程序进行实时动态地统计。提供商每发布一个共享软 

件,系统将此软件的描述自动添加到原有的满足JSON格式的 

字符串中; 

参考文献: 

【1]David Flanagan.JavaScript权威指南[M】.4版.北京:机械工业 

出版社,2003. 

[2] Jesse Ruderman.The same origin policy[EB/OL].http:// 

www.mozilla.org/projects/security/components/same—origin. 

htm1. 

(4)XMLHTTP代理获得跨域数据,并且将所有发布方的 

数据收集起来组织成一个新的满足JSON格式的字符串,最后 

传给回调函数; 

(5)回调函数获得数据后,通过控制CSS来更新Web页面, 

将数据呈现在客户端页面。 

[33] 柯自聪.AJAX开发精要【M】 E京:电子工业出版社,2006:63—68. 

[4】Daniel Rubio.JSON简介【EB/OL].http://dev2dev.bea.com.cn/ 

techdoc/2007/03/java—soa—introduction-json.htm1. 

[5]介绍JSON[EB/OL].http://www.json.org/json-zh.htm1. 

【6】 赵永屹,宿红毅,胡韶辉.基于AJAX与J2EE的新型Web应 

6结束语 

AJAX打破了使用页面重载的惯例技术组合,带来了更为 

强大的Web体验,如何充分利用AJAx的异步刷新特征实现 

更好的信息共享成为Web开发人员关注的焦点。JavaScript是 

用的设计与实现[J].计算机工程与设计,2007,28(1):189—192. 

【7] 王星,潘郁.基于AJAX技术的Web模型在网站开发中的应用 

研究[J】.微计算机信息,2006,22(9):206.207. 

[8】 吕林涛,万经华,周红芳.基于AJAx的Web无刷新页面快速 

更新数据方法[J】.计算机应用研究,2006,23(11):199—201. 

发布方应用(URL1) 

发布应用程序1n 

注册中心应用(URL) 

客户端 

l指向 

服务器端 

向JSON1 

垫 

XMLHttp代理 

JSON格式的数据 

(JSON1) 

已应用程序11的描述 

1指定\ 

~ 

中添加 

应用 

程序 

】n的 

描述 

使用 

4传回JSON 

URLConnection 

已应用程序12的描述 

/回调 

墼 

5页面呈现l 

格式的数据 

与不同URL连 

应用程序1n描述 

应用程序列表 

得JSON格式数据 

应用程序l1的描述 

应用程序l2的描述 

; 

+ 

JSON1数据 

发布方应用(URLn) 

应用程序1n的描述 

应用程序n1的描述 

应用程序n2的描述 

JSONn数据 

应用程序1111的描述 

图6 XMLHTTP代理+JSON的应用 

・——

5684-—— 


本文标签: 数据 访问 应用 策略 同源