我有一个 JS 客户端 (app.domain.com),它连接到一个用 rails 和 grape (api.domain.com) 编写的 API。 CORS 已设置,当在 api.domain.com 服务器上执行登录时,我在两个域之间有一个共享 cookie。
这个 JS 应用程序使用 Spine.js,所以一切都是用 CoffeeScript 编写的。 所以要发送删除请求,我只使用:
@item.destroy
这将向 API 发送一个 DELETE 请求。但是 cookie 没有与请求 header 一起发送,所以我不得不将上面的代码行更改为这一行:
$.ajax({
url: "http://api.domain.com/tasks/" + @item.id,
type: "DELETE",
crossDomain: true,
xhrFields: {
withCredentials: true
}
})
这非常有效。它将随请求发送响应 header “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 的请求中看到了这些 header (通过 Firebug ),但这种方法不起作用。
我错过了什么吗?
提前致谢!
达夫
最佳答案
在客户端应用程序的 Bootstrap 中执行此操作:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
})
然后服务器需要用这个 cors 头响应:
Access-Control-Allow-Credentials: true
关于javascript - 所有 jQuery ajax 调用的默认设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948571/