Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

跨域果然不是后端该参与的问题

  最近一直在纠结 RESTful API 的跨域问题,CORS 是个很坑的东西。虽然可以成功请求资源,但其性能就呵呵了。而且 IE8 的 XDR 对象根本就不支持跨域的 DELETE 和 PUT 之类的请求。由此我得出一个结论,跨域不能靠 CORS 来解决,还是前端自己解决比较靠谱。

CORS 是个大坑

  CORS 是通过后端提供一些响应头来让浏览器允许跨域,这绝对不是纯前端是解决办法。而且 CORS 是个大坑,我已经踩怕了,最近关于这个问题的纠结都快可以整理出一个系列了:

纯前端的跨域解决方案

  好在我不需要考虑 IE7- 的兼容,直接从 IE8 开始,所以纯前端解决跨域还是有点希望的,至少 IE8 是支持 postMessage 跨域 的。
  我的解决方案是在 API 服务器上放置一个 proxy.html 页面。当需要跨域调用 API 时,在调用的页面创建 IFRAME 去引入这个 proxy.html,然后在这个 IFRAME 的 contentWindow 上使用 postMessage,把本该发给 API 服务器的请求往 IFRAME 里发,由 proxy.html 转发到 API 服务器(这里就不再有跨域问题了)。请求完成后再由 proxy.html 将服务器响应的情况通过 postMessage 的形式反馈给调用页。
  整个流程看似非繁琐,但由于都是本地交互,不存在任何性能问题。而且这个解决方案不需要在后端代码中做奇怪的事,所以属于纯前端的解决方案。

这个方案同样也有坑

  我们把跨域的过程交给 postMessage 来处理,虽然数据都可以正常传输,但却了个很重要的因素 —— Cookie!其实跨域通信本身就存在 Cookie 无法同步的问题,并不是这个 postMessage 解决方案特有的问题。但这个解决方案确实没有解决 Cookie 同步的问题。正常的 Cookie 也许还可以通过手动传输来解决,要是 HTTP Only 的,那就苦逼了。
  不过就目前而言,这个解决方案是可以用的。至于 Cookie 的问题也许还得从长计议。

网名:
54.162.169.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^