发布网友 发布时间:2022-04-23 05:10
共1个回答
热心网友 时间:2022-04-09 12:14
做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中, 我们希望使用Ajax来获得B网站中的特定内容, 如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。 Ajax的跨域访问问题是现有的Ajax开发人员比较常遇到的问 题。 IE对于跨域访问的处理是,弹出警告框,提醒用户。 如果用户将该网站纳入可信任网站,或者调低安全级别, 那么这个问题IE就不会在提醒你。 FireFox等其它非微软的浏览器遇到跨域访问, 则解决方案统一是拒绝访问。 有人说,IE是主流浏览器,只要它能正常使用就好了。此言差已, IE虽然能够处理,但是是有前提的, 要么用户不厌其烦地在页面弹出警告框之后点击是( 点击否就不执行该Ajax调用了), 要么用户将该网站纳入可信任站点。这两种做法, 在企业管理系统的应用中倒是比较常见, 因为系统管理员可以以行政手段保证用户的行为。 但是对于互联网上的网站或者门户开发,这种做法则不行。 最近遇到了这个问题, 需要在跨域访问结束之后完成使主窗口出现一些特效, 搜索了一些资料, 通过不断尝试以及在不同浏览器中进行兼容性测试, 找到了几个可行的方案: 1、Web代理的方式。 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网 站的指定页面,由该页面代替用户页面完成交互, 从而返回合适的结果。 此方案可以解决现阶段所能够想到的多数跨域访问问题, 但要求A网站提供Web代理的支持, 因此A网站与B网站之间必须是紧密协作的,且每次交互过程, A网站的服务器负担增加,且无法代用户保存session状态。 2、on-Demand方式。MYMSN的门户就用的这种方式, 不过MYMSN中不涉及跨域访问问题。 动态控制script标记的生成, 通过修改script标记的src属性完成对跨域页面的调用。 此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式, 如果请求时传递的字符串过大时,可能会无法正常运行。 不过此方案非常适合聚合类门户使用。 3、iframe方式。 查看过醒来在javaeye上的一篇关于跨域访问的帖子, 他提到自己已经用iframe的方式解决了跨域访问问题。 数据提交跟获取,采用iframe这种方式的确可以了, 但由于父窗口与子窗口之间不能交互(跨域访问的情况下, 这种交互被拒绝),因此无法完成对父窗口效果的影响。 4、用户本地转储方式: IE本身依附于windows平台的特性为我们提供了一种基于i frame,利用内存来“绕行”的方案, 即两个window之间可以在客户端通过windows剪贴板的 方式进行数据传输, 只需要在接受数据的一方设置Interval进行轮询, 获得结果后清除Interval即可。 FF的平*立性决定了它不支持剪贴板这种方式, 而以往版本的FF中存在的插件漏洞又被fixed了, 所以FF无法通过内存来完成暗渡陈仓。 而由于文件操作FF也没有提供支持( 无法通过Cookie跨域完成数据传递), 致使这种技巧性的方式只能在IE中使用。 5、我自己用于解决这类问题的方式:结合了前面几种方式, 在访问A网站时,先请求B网站完成数据处理, 再根据返回的标识来获得所需的结果。这种方法的缺点也很明显, B网站的负载增大了。优点,对session也实现了保持, 同时A网站与B网站页面间的交互能力增强了。最重要的一点, 这种方案满足了我的全部需要。 总结一下,以上方案中可选择的情况下,我最推荐on- Demand方式,在不需要提交大量数据的情况下, 这种方式能够解决您的大部分问题。 参考资料: http://www.newbooks.com. cn/info/37166.html