授权 Header 仅在 AJAX CORS 请求中附加一次
Authorization Header appended only once in AJAX CORS request
我在 CORS 场景中从 Javascript 调用我的 RESTful API。
我正在使用 JQuery 发送我的 POST 经过身份验证的请求。
这是一个例子:
function post(settings, addAccessToken) {
settings.type = 'POST';
settings.cache = false;
if (settings.dataType === undefined)
settings.dataType = 'json';
if (addAccessToken) {
settings.xhrFields = { withCredentials: true };
settings.beforeSend = function (request) {
request.setRequestHeader('Authorization', 'Bearer <my access token>');
};
settings.headers = {
'Authorization': 'Bearer <my access token>'
};
}
return $.ajax(settings);
}
在服务器端,我可以看到第一个调用带有 'Authorization' Header 的正确值,而所有其他调用都没有这样的 Header.
我错过了什么?
谢谢
cghersi
我解决了我的问题,所以我想把答案告诉其他处于相同情况的人。
1) 问题是启用来自 server-side 的 OPTIONS http 请求。事实上,第一次调用同一个 url 但使用动词 'OPTIONS',然后第二次调用真正的 url 使用 POST|GET 方法。如果服务器没有正确响应第一个 'OPTIONS' 调用,例如指定正确的 Allowed Headers 等,第二次调用不起作用。
2) 表示法
settings.headers = {
'Authorization': 'Bearer <my access token>'
};
无效。设置 header 的唯一方法是:
settings.beforeSend = function (request) {
request.setRequestHeader('Authorization', 'Bearer <my access token>');
};
希望这对以后的其他人有所帮助。
cghersi
我在 CORS 场景中从 Javascript 调用我的 RESTful API。
我正在使用 JQuery 发送我的 POST 经过身份验证的请求。 这是一个例子:
function post(settings, addAccessToken) {
settings.type = 'POST';
settings.cache = false;
if (settings.dataType === undefined)
settings.dataType = 'json';
if (addAccessToken) {
settings.xhrFields = { withCredentials: true };
settings.beforeSend = function (request) {
request.setRequestHeader('Authorization', 'Bearer <my access token>');
};
settings.headers = {
'Authorization': 'Bearer <my access token>'
};
}
return $.ajax(settings);
}
在服务器端,我可以看到第一个调用带有 'Authorization' Header 的正确值,而所有其他调用都没有这样的 Header.
我错过了什么?
谢谢
cghersi
我解决了我的问题,所以我想把答案告诉其他处于相同情况的人。
1) 问题是启用来自 server-side 的 OPTIONS http 请求。事实上,第一次调用同一个 url 但使用动词 'OPTIONS',然后第二次调用真正的 url 使用 POST|GET 方法。如果服务器没有正确响应第一个 'OPTIONS' 调用,例如指定正确的 Allowed Headers 等,第二次调用不起作用。
2) 表示法
settings.headers = {
'Authorization': 'Bearer <my access token>'
};
无效。设置 header 的唯一方法是:
settings.beforeSend = function (request) {
request.setRequestHeader('Authorization', 'Bearer <my access token>');
};
希望这对以后的其他人有所帮助。
cghersi