admin管理员组

文章数量:1567037

2024年7月2日发(作者:)

1

JS跨域访问解决方案总结

0引言:

跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站点上的资

源。这种情况很常见,比如说通过style标签加载外部样式表文件、通过 img 标签

加载外部图片、通过 script 标签加载外部脚本文件、通过 Web font 加载字体文

件等等。默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin

policy)。

同源策略:如果两个页面的协议、域名和端口是完全相同的,那么它们就是同源的。

同源策略是为了防止从一个地址加载的文档或脚本访问或者设置从另外一个地址加

载的文档的属性。如果两个页面的主域名相同,则还可以通过设置

属性将它们认为是同源的。

随着 Web2.0 和 SNS 的兴起,Web 应用对跨域访问的需求也越来越多,但在脚本中

进行跨域请求是受安全性限制的,Web 开发人员迫切需要提供一种更安全、方便的

跨域请求方式来融合(Mashup)自己的 Web 应用。这样做的一个好处就是可以将请

求分摊到不同的服务器,减轻单个服务器压力以提高响应速度;另外一个好处是可

以将不同的业务逻辑分布到不同的服务器上以降低负载。

值得庆幸的是,跨域请求的标准已经出台,主流浏览器也已经实现了这一标准。W3C

工作组中的 Web Applications Working Group(Web 应用工作组)发布了一个

Cross-Origin Resource Sharing(跨域资源共享规范)推荐规范来解决跨域请求

的问题。该规范提供了一种更安全的跨域数据交换方法。具体规范的介绍可以访问

上面提供的网站地址。值得注意的是:该规范只能应用在类似XMLHttprequest 这

样的 API 容器内。IE8、Firefox 3.5 及其以后的版本、Chrome浏览器、Safari 4

等已经实现了 Cross-Origin Resource Sharing 规范,已经可以进行跨域请求了。

一、支持跨域访问处理浏览器

Cross-Origin Resource Sharing 的工作方式是通过添加 HTTP 头的方法来判断哪

些资源允许 Web 浏览器访问该域名下的信息。然而,对于那些 HTTP 请求导致用户

数据产生副作用的请求方法(特别是对于除了GET、某些 MIME 类型的 POST 之外

的 HTTP方法),该规范要求浏览器对请求进行“预先验”,通过发送 HTTP 的

OPTIONS 请求头询问服务器有哪些支持的方法,在征得服务器的同意后,再使用实

际的 HTTP 请求方法发送实际的请求。服务器也可以通知客户端是否需要将验证信

息(如 Cookie 和 HTTP Authentication 数据)随同请求一起发送。

下面我们就采用实际的例子说明 Cross-Origin Resource Sharing 是如何工作的。

1,简单请求

2

什么样的请求算是简单请求呢?简单请求必须满足下面2点:

a,只使用 GET、POST 进行的请求,这里的POST只包括发送给服务器的数据类型

(Content-Type)必须是 application/x-www-form-urlencoded、

multipart/form-data 或者 text/plain中一个。

b,HTTP 请求没有设置自定义的请求头,如我们常用的 X-JSON。

先使用下面的代码进行测试:

XML/HTML代码

1.

"

2. "/TR/xhtml1/DTD/>

3.

4.

5. 孟宪会之AJAX跨域请求测试

6.

7.

8.

9.

10.

37.

38.

然后,在服务器创建 的内容如下:

C# 代码

1. <%@ Page Language="C#" %>

2.

点击 “开始测试” 按钮,发送的请求和返回的响应信息如下:

XML/HTML代码

1. GET / HTTP/1.1

2. Host:

4

3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*

/*;q=0.8

5. Accept-Language: zh-cn,zh;q=0.5

6. Accept-Encoding: gzip,deflate

7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

8. Keep-Alive: 300

9. Connection: keep-alive

10. Referer: _xian_:801/CrossDomainAjax/Simp

11. Origin: _xian_:801

12. HTTP/1.x 200 OK

13. Date: Sun, 10 Jan 2010 13:52:00 GMT

14. Server: Microsoft-IIS/6.0

15. X-Powered-By:

16. X-AspNet-Version: 2.0.50727

17. Access-Control-Allow-Origin: _xian_:80

1

18. Set-Cookie: _SessionId=wk5v5nrs5wbfi4rmpjy2jujb; path=

/; HttpOnly

19. Cache-Control: private

20. Content-Type: text/html; charset=utf-8

21. Content-Length: 84

需要特别注意的是:在请求信息中,浏览器使用 Origin 这个 HTTP 头来标识该请

求来自于 _xian_:801;在返回的响应信息中,使用

Access-Control-Allow-Origin 头来控制哪些域名的脚本可以访问该资源。如果设

置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。如果有

多个,则只需要使用逗号分隔开即可。

注意:在服务器端,Access-Control-Allow-Origin 响应头

_xian_:801 中的端口信息不能省略。

有人可能会想:自己发送请求头会如何呢?比如

uestHeader("Origin","_xian_:801"); 实践

证明,自己设置 Origin 头是不行的。

是不是现在就可以采用 XMLHttpRequest 来请求任意一个网站的数据呢?还是不行

的。允许哪些域名可以访问,还需要服务器来设置 Access-Control-Allow-Origin

头来进行授权,具体的代码是:

5

der("Access-Control-Allow-Origin",

"_xian_:801");

这行代码就告诉浏览器,只有来自 _xian_:801 源下的脚

本才可以进行访问。

好了,上面我们就完成了一个简单的跨域请求,怎么样?感觉还是不错的吧。下面

我们进行一个“预检”请求。

2,预检请求

预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目

的就是为了判断实际发送的请求是否是安全的。下面的2种情况需要进行预检:

a,不是上面的简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的

POST 请求

b,在请求中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等

注意:在 iis 里进行测试,必须在“应用程序扩展”里面配置 .aspx 扩展的动作允许

OPTIONS。

下面我们举一个预检的请求:

XML/HTML代码

1.

"

2. "/TR/xhtml1/DTD/">

3.

4.

5. 孟宪会之AJAX跨域请求测试

6.

7.

8.

9.

10.

40.

41.

上面的例子我们发送 xml 格式的数据,并且,发送一个非标准的HTTP头

POWERED-BY-MENGXIANHUI 来说明服务器端该如何设置响应头的。

在服务器端, 的内容如下:

7

C#代码

1. <%@ Page Language="C#" %>

2.

点击“开始测试”按钮,将会执行下面的一系列请求。

XML/HTML代码

1. OPTIONS / HTTP/1.1

2. Host:

3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*

/*;q=0.8

5. Accept-Language: zh-cn,zh;q=0.5

6. Accept-Encoding: gzip,deflate

7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

8. Keep-Alive: 300

9. Connection: keep-alive

10. Origin: _xian_:801

11. Access-Control-Request-Method: POST

12. Access-Control-Request-Headers: powered-by-mengxianhui

13. HTTP/1.x 200 OK

14. Date: Sun, 10 Jan 2010 14:00:34 GMT

15. Server: Microsoft-IIS/6.0

16. X-Powered-By:

17. X-AspNet-Version: 2.0.50727

18. Access-Control-Allow-Origin: _xian_:80

1

19. Access-Control-Allow-Methods: POST, GET, OPTIONS

20. Access-Control-Allow-Headers: POWERED-BY-MENGXIANHUI

21. Access-Control-Max-Age: 30

22. Set-Cookie: _SessionId=5npqri55dl1k1zvij1tlw3re; path=

/; HttpOnly

9

23. Cache-Control: private

24. Content-Length: 0

25. POST / HTTP/1.1

26. Host:

27. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

28. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,

*/*;q=0.8

29. Accept-Language: zh-cn,zh;q=0.5

30. Accept-Encoding: gzip,deflate

31. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

32. Keep-Alive: 300

33. Connection: keep-alive

34. POWERED-BY-MENGXIANHUI: Approve

35. Content-Type: application/xml; charset=UTF-8

36. Referer: _xian_:801/CrossDomainAjax/Pref

37. Content-Length: 19

38. Origin: _xian_:801

39. Pragma: no-cache

40. Cache-Control: no-cache

41. 测试

42. HTTP/1.x 200 OK

43. Date: Sun, 10 Jan 2010 14:00:34 GMT

44. Server: Microsoft-IIS/6.0

45. X-Powered-By:

46. X-AspNet-Version: 2.0.50727

47. Access-Control-Allow-Origin: _xian_:80

1

48. Set-Cookie: _SessionId=byvose45zmtbqy45d2a1jf2i; path=

/; HttpOnly

49. Cache-Control: private

50. Content-Type: text/html; charset=utf-8

51. Content-Length: 65

以上的代码反映了预检请求的执行过程:首先发送 OPTIONS 请求头,用来向服务

器咨询服务器的更多信息,以便为后续的真实请求做准备。比如是否支持 POST 方

法等。值得注意的是:浏览器还发送Access-Control-Request-Method: POST 和

10

Access-Control-Request-Headers: powered-by-mengxianhui 请求头。

注意:以上过程是第一次请求的时候的过程,如果在 30 秒内重复点击按钮,你可

以看不到 OPTIONS 这一过程。则执行过程是这样的:

XML/HTML代码

1. POST / HTTP/1.1

2. Host:

3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*

/*;q=0.8

5. Accept-Language: zh-cn,zh;q=0.5

6. Accept-Encoding: gzip,deflate

7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

8. Keep-Alive: 300

9. Connection: keep-alive

10. POWERED-BY-MENGXIANHUI: Approve

11. Content-Type: application/xml; charset=UTF-8

12. Referer: _xian_:801/CrossDomainAjax/Pref

13. Content-Length: 19

14. Origin: _xian_:801

15. Pragma: no-cache

16. Cache-Control: no-cache

17. 测试

18. HTTP/1.x 200 OK

19. Date: Sun, 10 Jan 2010 14:06:32 GMT

20. Server: Microsoft-IIS/6.0

21. X-Powered-By:

22. X-AspNet-Version: 2.0.50727

23. Access-Control-Allow-Origin: _xian_:80

1

24. Set-Cookie: _SessionId=qs1c4urxywdbdx55u04pvual; path=

/; HttpOnly

25. Cache-Control: private

26. Content-Type: text/html; charset=utf-8

11

27. Content-Length: 65

为什么会这样?细心的同学可能注意到了,在服务器端有一行代码

der("Access-Control-Max-Age", "30"); 它是用来设置预检的有效时

间的,单位是秒。这一点要特别注意。

3,带验证信息的请求

身份验证是Web开发中经常遇到的问题,在跨域请求中,默认情况下是不发送验证

信息的。要想发送验证信息,需要进行withCredentials 属性,下面就是一个简单

请求的例子:

XML/HTML代码

1.

"

2. "/TR/xhtml1/DTD/">

3.

4.

5. 孟宪会之AJAX跨域请求测试

6.

7.

8.

9.

10.

38.

39.

点击“开始测试”,我们可以检测到下面的请求执行过程:

XML/HTML代码

1. GET / HTTP/1.1

2. Host:

3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*

/*;q=0.8

5. Accept-Language: zh-cn,zh;q=0.5

6. Accept-Encoding: gzip,deflate

7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

8. Keep-Alive: 300

13

9. Connection: keep-alive

10. Referer: _xian_:801/CrossDomainAjax/Requ

11. Origin: _xian_:801

12. HTTP/1.x 200 OK

13. Date: Sun, 10 Jan 2010 14:12:26 GMT

14. Server: Microsoft-IIS/6.0

15. X-Powered-By:

16. X-AspNet-Version: 2.0.50727

17. Access-Control-Allow-Origin: _xian_:80

1

18. Access-Control-Allow-Credentials: true

19. Set-Cookie: _SessionId=fn2zf0zq1cuwgf45fm5fw145; path=

/; HttpOnly

20. Set-Cookie: visit=1; expires=Sun, 10-Jan-2010 14:12:56 GMT; pa

th=/

21. Cache-Control: no-cache

22. Pragma: no-cache

23. Expires: -1

24. Content-Type: text/html; charset=utf-8

25. Content-Length: 1

从上面的响应中可以看出,Cookie 是会随请求一起发送的。如果我们多次点击测试

按钮,则可以看到请求和响应的结果是这样的:

XML/HTML代码

1. GET / HTTP/1.1

2. Host:

3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:

1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*

/*;q=0.8

5. Accept-Language: zh-cn,zh;q=0.5

6. Accept-Encoding: gzip,deflate

7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

8. Keep-Alive: 300

9. Connection: keep-alive

14

10. Referer: _xian_:801/CrossDomainAjax/Requ

11. Origin: _xian_:801

12. Cookie: _SessionId=fn2zf0zq1cuwgf45fm5fw145; visit=2

13. HTTP/1.x 200 OK

14. Date: Sun, 10 Jan 2010 14:13:58 GMT

15. Server: Microsoft-IIS/6.0

16. X-Powered-By:

17. X-AspNet-Version: 2.0.50727

18. Access-Control-Allow-Origin: _xian_:80

1

19. Access-Control-Allow-Credentials: true

20. Set-Cookie: visit=3; expires=Sun, 10-Jan-2010 14:14:28 GMT; pa

th=/

21. Cache-Control: no-cache

22. Pragma: no-cache

23. Expires: -1

24. Content-Type: text/html; charset=utf-8

25. Content-Length: 1

注意 Cookie: _SessionId=fn2zf0zq1cuwgf45fm5fw145; visit=2 这一行,

访问计数器已经被一起发送到服务器。

4,IE8中的实现方法

IE8已经开始支持跨域访问资源了,但是,IE8提供的功能还比较简单,可以进行简

单的请求,下面是一个使用的例子:

XML/HTML代码

1.

"

2. "/TR/xhtml1/DTD/">

3.

4.

5. 孟宪会之AJAX跨域请求测试

6.

7.

15

8.

9.

10.

27.

28.

另外,IE8的实现方法与其他浏览器不同。更多内容请参考 XDomainRequest 对象,地址是:

/zh-cn/library/cc288060(VS.85).aspx

最后,愿意测试的朋友可以访问这个 / 地址

进行“简单请求”的测试,本页面允许任何地址进行跨域访问。

具体情况有:

一、本域和子域的相互访问: 和

二、本域和其他域的相互访问: 和 用 iframe

三、本域和其他域的相互访问: 和 用 XMLHttpRequest

16

访问代理

四、本域和其他域的相互访问: 和 用 JS创建动态脚本

解决方法:

一、如果想做到数据的交互,那么和必须由你来开发

才可以。可以将用iframe添加到的某个页面下,在

和iframe里面都加上 = "",这样就可以统

一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用

里面的JS就可以了。(这个办法我没有尝试,不过理论可行)

二、当两个域不同时,如果想相互调用,那么同样需要两个域都是由你来开发才

可以。用iframe可以实现数据的互相调用。解决方案就是用

on[location是javascript里边管理地址栏的内置对象]对象的

hash属性。hash属性就是[hash是一个URL习惯用法,它是以字符 # 开始指向

一个位于文档中的anchor使浏览器打开一个新的URL,一个 location对象的

hash 属性是当前URL的anchor部分的名字,它由 hash 标记符和名字组成]。

利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通

信。不过除了IE之外其他大部分浏览器只要改变hash就会记录历史,你在前进

和后退时就需要处理,非常麻烦。不过再做简单的处理时还是可以用的,具体的

代码我再下面有下载。大体的过程是页面a和页面b在不同域下,b通过iframe

添加到a里,a通过JS修改iframe的hash值,b里面做一个监听(因为JS只

能修改hash,数据是否改变只能由b自己来判断),检测到b的hash值被修改

了,得到修改的值,经过处理返回a需要的值,再来修改a的hash值(这个地

方要注意,如果a本身是那种查询页面的话比如

domian/web/?id=3,在b中直接on是无法

取得数据的,同样报没有权限的错误,需要a把这个传过来,所以也比较麻烦),

同样a里面也要做监听,如果hash变化的话就取得返回的数据,再做相应的处

理。

三、这种情形是最经常遇到的,也是用的最多的了。就是和

你只能修改一个,也就是另外一个是别人的,人家告诉你你要取得

数据就访问某某连接参数是什么样子的,最后返回数据是什么格式的。而你需要

做的就是在你的域下新建一个网页,让服务器去别人的网站上取得数据,再返回

给你。domain1下的a向同域下的请求数据,向

domain2下的发送请求,返回数据给

, 再返回给a,这样就完成了一次数据请求。

在其中充当了代理的作用。具体可以看下我的代码。

四、这个和上个的区别就是请求是使用

其中的/是这样的,

点击“Click Me”按钮,生成一个新的script tag,下载对应的 Javascript 脚

本,结束时回调其中的setDivContent(),从而更新网页上一个div的内容。

Case III. iframe方式本域和其他域的相互访问:

和 用 iframe

数据提交跟获取,采用iframe这种方式的确可以了,但由于父窗口与子窗口之

间不能交互(跨域访问的情况下,这种交互被拒绝),因此无法完成对父窗口效

果的影响。在页面内嵌或动态生成指向别的网站的IFRAME,然后这2个网页间

可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor

hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,

而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从

而相应改变自己的状态。

1. domain1/:

19

请求: 送" onclick="sendRequest()" />

回复:

2. domain2/:

请求: 送" onclick="sendRequest()" />

回复:

两个网页基本相同,第一个网页内嵌一个IFRAME,在点击“发送”按钮后,会

将文本框里的内容通过hash fragment传给IFRAME。点击IFRAME里的“发送”

按钮后,它会将文本框里的内容通过hash fragment传给父窗口。因为是只改动

了hash fragment,浏览器不会重新load网页内容,这里使用了一个计时器来

检测URL变化,如果变化了,就更新其中一个div的内容 。

22

Case IV.本地转储方式 widows剪切板访问[比较土少

量数据应用]

IE本身依附于windows平台的特性为我们提供了一种基于iframe,利用内存来

“绕行”的方案,即两个window之间可以在客户端通过windows剪贴板的方式

进行数据传输,只需要在接受数据的一方设置Interval进行轮询,获得结果后

清除Interval即可。FF的平台独立性决定了它不支持剪贴板这种方式,而以往

版本的FF中存在的插件漏洞又被fixed了,所以FF无法通过内存来完成暗渡陈

仓。而由于文件操作FF 也没有提供支持(无法通过Cookie跨域完成数据传递),

致使这种技巧性的方式只能在IE中使用。

a("text","克隆");

a("text");//获取剪切版内容

剪切板是指windows 操作系统提供的一个暂存数据,并且提供共享的一个模块。

也称为数据中转站,剪切板在后台起作用,在内存里.,是操作系统设置的一段

存储区域,你是在硬盘里找不到的.你只要有文本输入的地方按CRTL+V或右键粘

贴就出现了,.新的内容送到剪切板后,将覆盖旧内容。即剪切板只能保存当前

的一份内容,因在内存里,所以,电脑关闭重启,存在剪切板中的内容将丢失。

Case V: (其实还是在服务端A用iframe解决了与

服务器B通信)

要解决的问题:发生在用户提交网页

URL

(还包括

Tag, Notes

等)给

Bookmark

服务器时。

关于

URL

的提交至少可以有三种方式:

1.

登陆

Bookmark

服务器的提交页面,将要收藏的

URL

通过该页面提交给服务

器。

2.

安装浏览器插件,通过插件将

URL

提交给服务器。

3.

Bookmark

服务器动态加载

javascript

小工具到当前页面,通过它来完

成提交工作。

第一种方式开发起来最简单,但对用户来讲比较麻烦,每次都需要先登陆

Bookmark

服务器才能完成提交;第二种方式我并不熟悉插件开发,而且用户也

不喜欢太多的插件堆满自己的浏览器;第三种方式开发难度小,又避免了每次登

陆服务器的麻烦,所以最终采用它。第三种方式中动态加载的

javascript

工具除了需要生成

UI

供用户填写信息(

URL

tag

notes

等),当用户

点击提交的时候,还要完成与服务器通信的功能。

跨域访问,简单来说就是

A

网站的

javascript

代码试图访问

B

网站,

包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止

23

的。写过跨域访问

ajax

的朋友相信都遇到过被告知“没有权限”的情况。通过

XMLHttp

来发送数据给

Bookmark

服务器的尝试失败了。于是,看到网上的一

些资料,我又开始尝试用

javascript

小工具在用户网页动态创建一个隐藏的

iframe, iframe

src

指向服务器的一个

servlet

,试图通过调用

iframe

中提供的

javascript

来完成与服务器的通信。但不幸的是,用户网页中的

javascript

代码访问

iframe

也被浏览器归为跨域访问(特指

iframe

src

指向其它网站的情形),尝试再次失败。

最终,在一篇文章中看到,与

iframe

不同,如果

A

网站从

B

网站加载

javascript

A

网站可以自由的访问该

javascript

的内容,并不会被浏览

器认为是跨域访问。模仿刚才

iframe

的思路,当用户点击提交时,可以动态

创建一个

javascript

对象,该对象的

src

指向

Bookmark

服务器的一个

servlet

,注意:

URL

Tag

Notes

User

Password

等信息被作为

src URL

参数传给服务器。请看下面的代码:

var url = "localhost:8080/Deeryard/BookmarkServlet?" +

"url=" + url_source + "&" + "title=" + title + "&" +

"tag=" + tag + "&" + "notes=" + notes + "&" + "user=" + user

+ "&" +

"password=" + password;

url = encodeURI(url);

//Submit to server with a trick

var js_obj = Element(

"script"

);

js_ = "text/javascript"

;

js_ribute(

"src"

, url);

//Get response from server by appending it to document

Child(js_obj);

上面例子中,

js_ribute()

将信息作为

src

URL

参数提交给了

Bookmark servlet

。那么用户又如何取得服务器的响应信息呢?答案就是最末一行

代码,

servlet

的输出必须是

javascript

代码,它可以调用用户网页上的其他

javascript

函数,以及操作

dom

对象。下面的

servlet

代码生成了一个

javascript

数调用:

("onServerResponse(INADEQUATE_INFORMATION);");

Child(js_obj)

执行后

onServerResponse(

INADEQUATE_INFORMATION)

就会得到执行,使客户网页响应

服务器结果。这样一个完整的通信过程就完成了。

24

解决方法小结:

方法一:设定domain属性

只适合情形1。Document对象的domain属性一定程度上缓解了多个二级域名时带

来的不便,只要local和remote的domain属性都设为同一个域()就

可以互相访问了。不过只是一定程度上的,只能接受两个域共有的部分(如

不能设成反过来也不可,只能为),

还要保持至少有一个“点号”。

方法二:window共享内存

Windows剪切板访问

方法三:js脚本植入

1和2都适用,在local端的页面中插入一个在remote端部署的动态脚本生成程序,

然后通过将请求命令编码成url作为包含脚本的src,响应端的程序处理url查询命

令返回特定的javascript代码(包含操作或者数据),代码在插入时被浏览器解析

并执行。这也是baidu在用的方法。使用