【问题标题】:Can't send ajax headers from js script无法从 js 脚本发送 ajax 标头
【发布时间】:2016-12-29 18:56:37
【问题描述】:

我已经构建了一个 API。它监听 8000 端口,而我的应用正在监听 3000 端口。

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "http://localhost:8000/communities",
  "method": "GET",
  "headers": {
    "authorization": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiWVx1MDBlMWJpciIsImFkbWluIjp0cnVlfQ.xtvKyxq26b7K02mVv21vkt7PbeOUatMbgxLOHIj7CQg",
    "cache-control": "no-cache",
  }
}

$(document).ready(function(){
    $.ajax(settings).done(function (response) {
    console.log(response);
    });
});

我知道这不是某些设置的问题,因为在服务器中停用令牌身份验证我得到了数据。此代码是从 PostMan chrome 应用程序生成的,但是从我的 js 文件进行查询时,我收到 401 错误,并且从服务器我可以看到 authorization 标头尚未设置。可能是什么问题?

在chrome控制台出现:

Failed to load resource: the server responded with a status of 401 (Unauthorized)

服务器从 localhost:3000 接收到的标头

{'ACCEPT': '*/*', 'ACCESS-CONTROL-REQUEST-METHOD': 'GET', 'CONNECTION': 'keep-alive', 'ACCEPT-ENCODING': 'gzip, deflate, sdch, br', 'HOST': 'localhost:8000', 'REFERER': 'http://localhost:3000/', 'USER-AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36', 'ORIGIN': 'http://localhost:3000', 'ACCESS-CONTROL-REQUEST-HEADERS': 'authorization, cache-control, 'ACCEPT-LANGUAGE': 'es-ES,es;q=0.8'}

来自邮递员

{'AUTHORIZATION': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiWVx1MDBlMWJpciIsImFkbWluIjp0cnVlfQ.xtvKyxq26b7K02mVv21vkt7PbeOUatMbgxLOHIj7CQg', 'ACCEPT': '*/*', 'CACHE-CONTROL': 'no-cache', 'POSTMAN-TOKEN': '06aba643-b6cb-3a7a-9e6e-61b1f2d9e94e', 'CONNECTION': 'keep-alive', 'ACCEPT-ENCODING': 'gzip, deflate, sdch, br', 'HOST': 'localhost:8000', 'USER-AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36', 'ACCEPT-LANGUAGE': 'es-ES,es;q=0.8'}

PD:服务器设置也允许 CORS。

【问题讨论】:

  • 很可能您没有考虑到处理飞行前选项请求的需要……但您没有引用控制台中的错误消息或网络选项卡中的完整请求,所以很难确定。
  • 您如何处理您的 oauth 流程?
  • @Quentin 添加了来自 chrome 控制台的消息和服务器收到的标头。
  • @YábirGarcia — 它是什么请求方法?这些标头确实表明这是您未处理(或使用 PostMan 复制)的预检 OPTIONS 请求
  • @Quentin 它接受 GET 和 POST。在这种情况下,我正在尝试 GET

标签: javascript ajax


【解决方案1】:

它接受 GET 和 POST。在这种情况下,我正在尝试 GET

由于您不是发出简单的请求(您正在添加 HTTP 标头),因此浏览器会发出 preflight OPTIONS request 以请求允许使用额外的请求标头发出 GET 请求。

服务器拒绝该 OPTIONS 请求为未经授权,浏览器拒绝发出 GET 请求。

您需要编写服务器端代码来处理 OPTIONS 请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多