Rails,REST架构和HTML 5:具有飞行前请求的跨域请求

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

当前的Rails RESTful架构依赖于四个HTTP谓词:GET,POST,PUT,DELETE。 但是,在访问控制规范中,它规定非简单方法(PUT,DELETE)需要使用HTTP谓词OPTIONS的飞行前请求。 此外,在测试期间,我们还发现了Firefox 3.5.8的飞行前POST请求。

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

几天前我发布了一个Gem,它通过Rack Middleware实现了CORS支持:

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

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

这是来自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标头。 如果你在没有这个头的情况下向它发送Ajax请求,Rails不喜欢它,并忽略请求的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设置了Cross Origin Requests!

我修改了rails来支持options方法。 我把它发布在rails列表中,但它从未超过列表。

GitHub Gist: Rails XHR2 / CORS / OPTIONS支持

ctrl + f找到有#Options的行 – 这些是我改变的唯一行。

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