Access Control Request Headers, é adicionado ao cabeçalho na solicitação AJAX com jQuery


405

Gostaria de adicionar um cabeçalho personalizado a uma solicitação AJAX POST do jQuery.

Eu tentei isso:

$.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);
});

Quando envio esta solicitação e assisto ao FireBug, vejo este cabeçalho:

OPÇÕES xxxx / aaaa
Host HTTP / 1.1 : 127.0.0.1:6666
Agente do usuário: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: fr, fr-fr; q = 0,8, pt-br; q = 0,5, pt; q = 0,3
Accept-Encoding: gzip, deflate
Conexão: mantenha -alive
Origem: null
Método de solicitação de controle de
acesso : POST Controle de acesso-solicitação-cabeçalhos: meu-primeiro-cabeçalho, meu-segundo-cabeçalho
Pragma: sem cache
Controle de cache: sem cache

Por que meus cabeçalhos personalizados vão para Access-Control-Request-Headers:

Cabeçalhos de solicitação de controle de acesso: meu primeiro cabeçalho, meu segundo cabeçalho

Eu estava esperando um valor de cabeçalho como este:

Meu primeiro cabeçalho: primeiro valor
Meu segundo cabeçalho: segundo valor

É possível?



O título da pergunta deve indicar que "Para outro domínio"
Contador م

Respostas:


138

O que você viu no Firefox não foi a solicitação real; observe que o método HTTP é OPTIONS, não POST. Na verdade, foi a solicitação 'pré-vôo' que o navegador faz para determinar se uma solicitação AJAX entre domínios deve ser permitida:

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

O cabeçalho de controle de acesso-solicitação-cabeçalho na solicitação de pré-voo inclui a lista de cabeçalhos na solicitação real. Espera-se que o servidor informe novamente se esses cabeçalhos são suportados neste contexto ou não, antes que o navegador envie a solicitação real.


438

Aqui está um exemplo de como definir um cabeçalho de solicitação em uma chamada do 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
thx, sei enviar solicitação Ajax com cabeçalho personalizado. Meu problema é com domínio diferente. Todos os meus cabeçalhos personalizados são colocados em cabeçalhos de solicitação de controle de acesso. é apenas segurança no navegador: entre domínios.
fingerup 23/11/12

Sim, nas solicitações de vários domínios do navegador podem causar algumas dificuldades. você sempre pode usar algum script de proxy para enviar suas solicitações entre domínios
milkovsky

Como adiciono os cabeçalhos com a API KEY?
precisa saber é


178

Este código abaixo funciona para mim. Eu sempre uso apenas aspas simples e funciona bem. Sugiro que você use apenas aspas simples ou duplas, mas não misturadas.

$.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);
    }
  });

11
thx, sei enviar solicitação Ajax com cabeçalho personalizado. Meu problema é com domínio diferente. Todos os meus cabeçalhos personalizados são colocados em cabeçalhos de solicitação de controle de acesso. é apenas segurança no navegador: entre domínios.
fingerup

Obrigado, eu tinha definido cabeçalhos: "Autorização: Basic XXXXXX" acidentalmente, e o iOS 9 / Safari 9 estava lançando o SyntaxError DOM 12 em um projeto.
Mark

4
Você quer dizer aspas duplas ou simples? Eu não acho que alguém usaria colchetes duplos.
DBS

3
Aspas duplas ou simples (não "colchetes") não têm nada a ver aqui.
Pere

seu X-CSRF-TOKEN para o Laravel 5.6 e superior #
Abdul Rahman A Samad

12

Como você envia cabeçalhos personalizados para que sua solicitação CORS não seja uma solicitação simples , o navegador envia primeiro uma solicitação OPTIONS de comprovação para verificar se o servidor permite sua solicitação.

Digite a descrição da imagem aqui

Se você ativar o CORS no servidor, seu código funcionará. Você também pode usar a busca por JavaScript ( aqui )

Aqui está um exemplo de configuração que ativa o CORS no nginx (arquivo nginx.conf):

Aqui está um exemplo de configuração que ativa o CORS no Apache (arquivo .htaccess)


3

E é por isso que você não pode criar um bot com JavaScript, porque suas opções são limitadas ao que o navegador permite. Você não pode simplesmente solicitar um navegador que siga a política do CORS , seguida pela maioria dos navegadores, para enviar solicitações aleatórias para outras origens e permitir que você obtenha a resposta com simplicidade!

Além disso, se você tentou editar alguns cabeçalhos de solicitação manualmente, como origin-headernas ferramentas de desenvolvedores que acompanham os navegadores, o navegador recusará sua edição e poderá enviar uma OPTIONSsolicitação de comprovação .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.