这是来自 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 的跨域请求做好了准备!