8

我有一个 JS 客户端 (app.domain.com),它连接到用 rails 和 grape (api.domain.com) 编写的 API。CORS 已设置,我在两个域之间有一个共享 cookie,因为登录是在 api.domain.com 服务器上执行的。

这个 JS 应用程序使用 Spine.js,所以一切都是用 CoffeeScript 编写的。因此,要发送删除请求,我只需使用:

    @item.destroy

这将向 API 发送 DELETE 请求。但是 cookie 没有与请求标头一起发送,所以我不得不将上面的代码行更改为这一行:

    $.ajax({
        url: "http://api.domain.com/tasks/" + @item.id,
        type: "DELETE",
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }
    })

这非常有效。它将随请求发送响应标头“Access-Control-Allow-Credentials:true”,以便提交 cookie 并验证操作。

但是,这样我将不得不为每个请求编写几行代码,这非常耗时,并且也使 Spine 框架的好处无效。

我知道可以在 jQuery 中设置默认的 ajax 设置,以便随后的每个 ajax 调用都将使用这些设置。所以我试过:

jQuery.ajaxSetup({
headers: {
    "X-Requested-With": "XMLHttpRequest",
    "Access-Control-Allow-Credentials": "true"
    }, crossDomain: true
});

这与我手动为每个 ajax 调用设置的设置基本相同。但是,尽管我在发送到 API 的请求中看到这些标头(通过萤火虫),但这种方法不起作用。

我错过了什么吗?

提前致谢!

达夫

4

2 回答 2

2

在客户端应用程序的引导程序中执行此操作:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
})

然后服务器需要用这个 cors 头响应:

Access-Control-Allow-Credentials: true
于 2016-06-25T22:02:37.707 回答
1

我最近遇到了一个非常相似的问题,并找到了两种简单的方法。首先创建 java 脚本函数来为您进行调用,即:

function delete (url){
   $.ajax({
        url: url,
        type: "DELETE",
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }
    })
}

或者如果在多个页面上重用,我建议创建一个可以轻松包含和重用的小类。这也使得不仅可以设置默认设置,还可以为常用的 api 调用创建函数。

于 2014-09-29T06:31:17.657 回答