论坛首页 Web前端技术论坛

求XmlHttp 跨域的解决方案

浏览 67894 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-12-29  
叶子 写道
json也不太爽

一个设想:flash加载其他域下的东西方便不?


json哪里不爽?可以给个解释吗?
看到在js2的提案中已经有了jsonRequest,很好用的
0 请登录后投票
   发表时间:2006-12-30  
完美的办法,不破坏XHR的限制,
在服务器做个代理功能就可以了,不直接用XHR发送跨域请求。
0 请登录后投票
   发表时间:2006-12-30  
完美的办法,不破坏XHR的限制,
在服务器做个代理功能就可以了,不直接用XHR发送跨域请求。
0 请登录后投票
   发表时间:2007-01-11  
PHPRPC 支持跨域调用,但不是用 xmlhttp 实现的,而是通过动态添加 js 脚本机制实现的。不过使用 PHPRPC 时不必在乎用的是什么方式,他会根据是否跨域来自动选择使用 xmlhttp 还是动态 js。
0 请登录后投票
   发表时间:2007-03-28  
yahoo有这个跨域代理
自己去搞一个咯
php的 我自己用servlet
如果你服务器不想装php就用servlet好了
0 请登录后投票
   发表时间:2007-04-23  
不是很明白!
有没有人可以给个实际的例子实际演示说明的?
dlee大师的附件下载过来,JS有错误,跑不起来。实在奇怪!
正好碰到类似的问题,比较急。
高手们请再指点一下。
0 请登录后投票
   发表时间:2007-04-23  
解决浏览器的跨域问题,不要想完全通过在浏览器中使用脚本绕过浏览器的相同来源策略,那是做不到的,除非你所使用的浏览器版本刚好存在严重的bug,否则做浏览器的那帮人都不必混了。

解决跨域问题,要从浏览器之外想办法,据我所知有两种方法:

方法1:在服务器端实现一个服务器端的代理,接收跨域的请求,通过HTTP得到请求的数据后转发给客户端的浏览器。
但是你在客户端也要做一些事情,因为XMLHttpRequest对象默认情况下是不接受发到其他域的URL的。方法是使用Decorator模式给XMLHttpRequest加上一层封装,将发到其他域的URL改写为发给服务器端代理的URL。

《Ajax模式与最佳实践》最后一章:“基于REST的MVC模式”给出了一种非常详细的解决方案,这种方案也是属于方法1的。

方法2:在客户端实现一个客户端的HTTP代理,配置浏览器使用这个HTTP代理。通过HTTP代理请求跨域的数据(通过一个绑定在本域的特殊的URL,例如:/selenium-server/RemoteRunner.html?sessionId=260113)这是在Selenium RC中所使用的方式。他们为了绕过浏览器的相同来源策略,以便可以对于任意的Web网站执行客户端的自动测试,使用了一个Java实现的客户端的HTTP代理。
详情请看Selenium RC的文档:
http://www.openqa.org/selenium-rc/tutorial.html
在方法2中,同样要使用Decorator模式给XMLHttpRequest加上一层封装,将发到其他域的URL改写为能够触发客户端代理相应操作的URL。

有人会争论说,通过动态加载脚本(就是动态创建<script>元素)的方式可以实现跨域,那不是真正的跨域,因为数据的交互是单向的。那样你最多只能调用其他域的功能,你取回的数据还是无法与本域的数据(HTML DOM树)进行交互。

很抱歉我没有提供现成可用的代码,我其实不是很喜欢有些同学什么都等别人给一个现成的答案的态度。
0 请登录后投票
   发表时间:2007-04-24  
我见过总结的最全的一篇文章.
http://www-128.ibm.com/developerworks/library/x-securemashups/
0 请登录后投票
   发表时间:2007-04-25  
参考一下Ext的Ext.data.ScriptTagProxy, 用动态创建<script>标签的方式实现跨域的访问.
0 请登录后投票
   发表时间:2007-04-25  
fcoffee 写道
参考一下Ext的Ext.data.ScriptTagProxy, 用动态创建<script>标签的方式实现跨域的访问.

不好意思,我完全不了解Ext,貌似你很了解。我希望你能解答我以下的问题,我们也可以借此来做一些更深入的讨论。

按照我对于浏览器端JavaScript的了解,我的判断是这样的:
Ext.data.ScriptTagProxy有一个限制条件,那就是服务器端返回的数据的格式应该是一段JavaScript或者JSON格式的数据,这样在evaluate之后,才能创建一些能够与本域交互(就是与本域的JavaScript对象和HTML DOM树交互)的数据。

这其实是一个很大的限制,这意味着通过Ext.data.ScriptTagProxy仍然无法获取任意的数据。你要想获取来自本域之外某个服务器的数据,必需那个服务器将这些数据开放为JSON格式,暴露出这样的Web服务,这样你才能够获取到。

你如果不相信,可以自己去看一下这个例子:
http://photos.mclanahan.net/jquery/jquery-svn/trunk/plugins/ext/examples/grid/paging.js
并且看一下这个例子所请求的数据的格式:
http://www.yui-ext.com/forum2/topics-remote.php

先学好JavaScript,再去学好Ext,好吗?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics