使用jQuery将访问控制请求标头添加到AJAX请求的标头中


404

我想向jQuery的AJAX POST请求添加自定义标头。

我已经试过了:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

当我发送此请求并观看FireBug时,看到以下标头:

选项xxxx / yyyy HTTP / 1.1
主机:127.0.0.1:6666
用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:11.0)Gecko / 20100101 Firefox / 11.0
接受:text / html,application / xhtml + xml, application / xml; q = 0.9,/ ; q = 0.8
Accept-Language:fr,fr-fr; q = 0.8,en-us; q = 0.5,en; q = 0.3
Accept-Encoding:gzip,deflate
连接:keep -alive
来源:null
访问控制请求方法:POST
访问控制请求头:my-first-header,my-second-header
语法:no-cache
缓存控制:no-cache

为什么我的自定义标头转到Access-Control-Request-Headers

访问控制请求标头:我的第一标头,我的第二标头

我期待这样的标头值:

My-First-Header:第一个值
My-Second-Header:第二个值

可能吗?



问题的标题应指出“ For Other Domain”
会计师م

Answers:


138

您在Firefox中看到的不是实际的请求;请注意,HTTP方法是OPTIONS,而不是POST。实际上,这是浏览器发出的“飞行前”请求,以确定是否应允许跨域AJAX请求:

http://www.w3.org/TR/cors/

飞行前请求中的Access-Control-Request-Headers标头包括实际请求中的标头列表。然后,在浏览器提交实际请求之前,服务器将在此上下文中报告是否支持这些标头。


438

这是一个如何在jQuery Ajax调用中设置请求标头的示例:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});

10
谢谢,我知道发送带有自定义标头的Ajax请求。我的问题是在不同的域中。我所有的自定义标头都放入Access-Control-Request-Headers中。这只是浏览器中的安全性:跨域。
fingerup 2012年

是的,在浏览器中,跨域请求可能会带来一些困难。您可以随时使用一些代理脚本来发送跨域请求
milkovsky 2012年

如何使用API​​ KEY添加标头?
Si8


178

下面的代码对我有用。我总是只使用单引号,并且效果很好。我建议您只使用单引号双引号,但不要混用。

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

1
谢谢,我知道发送带有自定义标头的Ajax请求。我的问题是在不同的域中。我所有的自定义标头都放入Access-Control-Request-Headers中。这只是浏览器中的安全性:跨域。
fingerup 2014年

谢谢,我意外设置了标题:“ Authorization:Basic XXXXXX”,iOS 9 / Safari 9在项目上抛出了SyntaxError DOM 12。
2015年

4
您是指双引号还是单引号?我认为没有人会使用双括号。
星展银行

3
双引号或单引号(不是“括号”)在这里没有任何关系。
佩雷

适用于Laravel 5.6及更高版本的X-CSRF-TOKEN
Abdul Rahman A Samad

12

因为您发送自定义标头,所以您的CORS请求不是一个简单的请求,因此浏览器首先发送一个预检OPTIONS请求,以检查服务器是否允许您的请求。

在此处输入图片说明

如果您在服务器上打开CORS,则您的代码将起作用。您也可以改用JavaScript提取(此处

这是在nginx(nginx.conf文件)打开CORS的示例配置:

这是一个在Apache上打开CORS的示例配置(.htaccess文件)


3

这就是为什么您无法使用JavaScript创建漫游器的原因,因为您的选择仅限于浏览器允许您执行的操作。您不能仅仅订购遵循大多数浏览器遵循的CORS策略的浏览器, 就将随机请求发送到其他来源,并让您获得简单的响应!

此外,如果您尝试手动编辑一些请求标头,例如origin-header使用浏览器附带的开发人员工具,浏览器将拒绝您的编辑并可能发送预检OPTIONS请求。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.