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?

dedilhado
fonte
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.

karlgold
fonte
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));
  }
});
milkovsky
fonte
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 é
@ Si8 verifique este post stackoverflow.com/questions/5517281/...
milkovsky
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);
    }
  });
Gráfico
fonte
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)

Kamil Kiełczewski
fonte
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 .

o contador
fonte
-10

Tente usar a gema rack-cors . E adicione o campo de cabeçalho na sua chamada Ajax.

Jie Sun
fonte