跨域请求withCredentials无法在Firefox中运行

时间:2012-03-08 07:35:53

标签: firefox google-chrome jquery backbone.js

我正在构建一个Backbone.js应用程序来与我建立的api交谈。

api坐在上面     api.foo.com 网站上     web.foo.com

我设法让CORS使用apache中适当的头字段

Header set Access-Control-Allow-Origin "http://web.foo.com"
Header set Access-Control-Allow-Methods "GET,PUT,POST,DELETE,OPTIONS"
Header set Access-Control-Allow-Headers Content-Type
Header set Access-Control-Allow-Credentials "true"
Header append Access-Control-Allow-Headers Origin
Header append Access-Control-Allow-Headers Accept
Header append Access-Control-Allow-Headers X-Requested-With

并将xhrFields设置为

    f = { withCredentials: true}

    params.xhrFields = f;

    // Make the request, allowing the user to override any Ajax options.
    $.ajax(params);

这一切都适用于chrome。我即将发布api.foo.com/sessions登录信息,获取一个cookie,然后使用该cookie向api.foo.com发送另一个请求。

不幸的是,当我切换到Firefox 10.0.7时,这没有用。 withCredentials似乎没有得到jquery来获取cookie并使用它。

与大多数与stackoverflow相关的问题不同,这不是一次性的,我需要让它在浏览器中保持一致(我还没有进入IE)。

我正在使用

Backbone.js 0.9.1 jquery 1.7.1 要求1.0.7 下划线1.3.1

适用于

Chrome 17.0.963.65

无法在firefox 10.0.2上运行

有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

我想我最后会做的更新这个问题。我得到的感觉是,CORS不是一件容易做的事情(出于安全原因)。关于这个主题的大多数答案都归结为“代理或做CORS”而没有太多解释代理是多么容易。下面是我需要放在我的网站apache文件中以获取所有播放niceley的内容

    ProxyPass /api http://api.foo.com/
    ProxyPassReverse /api http://api.foo.com/

<Location /api>
    Order allow,deny
    Allow from all
</Location>

这是对web.foo.com/api的任何请求,apache自动代理将其传递给api.foo com。这意味着不需要任何CORS标头,并且所有cookie都可以正常工作。

这也意味着你仍然有api.foo.com运行其他非javascript查询的软件

这是解决CORS内容需求的一种非常简单的方法,同时仍将内部api与前端分开。