4

在致力于使我们的网站对 HTML 5 友好的项目时,我们渴望接受跨域请求的新方法(不再通过隐藏的 iframe 发布!!!)。使用访问控制规范,我们开始设置一些测试来验证各种浏览器的行为。

当前的 Rails RESTful 架构依赖于四个 HTTP 动词:GET、POST、PUT、DELETE。然而,在访问控制规范中,它规定非简单方法(PUT、DELETE)需要使用 HTTP 动词 OPTIONS 的飞行前请求。此外,在测试过程中,我们发现 Firefox 3.5.8 也存在飞行前 POST 请求。

我的问题是这个。有人知道 Rails 框架的任何项目致力于解决这个问题吗?如果没有,关于支持 OPTIONS 方法的最佳策略的任何意见,因为它必须支持所有 POST、PUT、DELETE 方法的路由?

4

3 回答 3

9

几天前我发布了一个通过机架中间件实现 CORS 支持的 Gem:

http://github.com/cyu/rack-cors

关于预检 CORS 请求,我无法在 Chrome 中获得预检请求(通过简单的 CORS 请求工作正常)。在 Internet 上搜索表明它可能不受支持。我已经在 Chrome 论坛中提出了有关此问题的问题,但尚未收到回复。

于 2010-06-09T03:56:20.033 回答
3

这是来自 Spine js 文档

CORs Rails 集成

让我们创建一个 cor 方法,它将一些请求访问控制标头添加到请求的响应中。

将以下内容添加到 app/application_controller.rb:

before_filter :cor

def cor
  headers["Access-Control-Allow-Origin"]  = "js-app-origin.com"
  headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
  headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
  head(:ok) if request.request_method == "OPTIONS"
end

尽管 Access-Control-Allow-Origin 使用通配符,但我强烈建议不要使用它,因为它会使您的应用程序面临各种 CSRF 攻击。使用白名单会更好、更安全。

Access-Control-Allow-Headers 部分很重要,尤其是 X-Requested-With 标头。Rails 不喜欢在没有此标头的情况下向它发送 Ajax 请求,并忽略请求的 Accept 标头,在它实际上应该返回 JSON 时返回 HTML。

值得注意的是,jQuery 默认情况下不会在跨域请求中添加此标头。这是 Spine 在内部解决的问题,但如果您使用纯 jQuery 处理 COR,则需要手动指定标头。

jQuery.ajaxSetup({
  headers: {"X-Requested-With": "XMLHttpRequest"}
});

一些浏览器首先向服务器发送选项请求,以确保设置了正确的访问标头。您需要在 Rails 中捕捉到这一点,返回 200 状态和正确的标题。为此,请将以下内容添加到应用程序的 config/routes.rb 文件中:

match '*all' => 'application#cor', :constraints => {:method => 'OPTIONS'}

就是这样,您已经为 Spine 的跨域请求做好了准备!

于 2012-07-09T12:31:54.493 回答
0

我破解了 rails 来支持 options 方法。我把它贴在了 rails 列表上,但它从来没有超过这个列表。

GitHub Gist:Rails XHR2 / CORS / OPTIONS 支持

ctrl+f 查找具有#Options 的行 - 这些是我唯一更改的行。

这是一个示例实现| 和另一个

于 2010-07-15T04:28:40.860 回答