Encabezados de solicitud de control de acceso, se agrega al encabezado en la solicitud AJAX con jQuery


405

Me gustaría agregar un encabezado personalizado a una solicitud POST AJAX de jQuery.

He intentado esto:

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

Cuando envío esta solicitud y miro con FireBug, veo este encabezado:

OPCIONES xxxx / aaaa HTTP / 1.1
Host: 127.0.0.1:6666
User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Aceptar: text / html, application / xhtml + xml, application / xml; q = 0.9, / ; q = 0.8
Idioma de aceptación: fr, fr-fr; q = 0.8, en-us; q = 0.5, en; q = 0.3
Codificación de aceptación: gzip, desinflar
Conexión: mantener -alive
Origen: nulo
Access-Control-Request-Method: POST
Access-Control-Request-Headers: my-first-header, my-second-header
Pragma: no-cache
Cache-Control: no-cache

¿Por qué mis encabezados personalizados van a Access-Control-Request-Headers:

Acceso-Control-Solicitud-Encabezados: mi-primer-encabezado, mi-segundo-encabezado

Esperaba unos valores de encabezado como este:

Mi primer encabezado: primer valor
Mi segundo encabezado: segundo valor

¿Es posible?



El título de la pregunta debe indicar que "Para otro dominio"
Contador م

Respuestas:


138

Lo que viste en Firefox no fue la solicitud real; tenga en cuenta que el método HTTP es OPCIONES, no POST. En realidad, fue la solicitud 'previa al vuelo' que realiza el navegador para determinar si se debe permitir una solicitud AJAX entre dominios:

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

El encabezado Access-Control-Request-Headers en la solicitud previa al vuelo incluye la lista de encabezados en la solicitud real. Luego se espera que el servidor informe si estos encabezados son compatibles en este contexto o no, antes de que el navegador envíe la solicitud real.


438

Aquí hay un ejemplo de cómo configurar un encabezado de solicitud en una llamada 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
Gracias, sé que enviar solicitud Ajax con encabezado personalizado. Mi problema es con un dominio diferente. Todos mis encabezados personalizados se colocan en Access-Control-Request-Headers. es solo seguridad en el navegador: dominio cruzado.
fingerup

Sí, en el navegador, las solicitudes de dominio cruzado pueden causar algunas dificultades. siempre puede usar algún script proxy para enviar sus solicitudes entre dominios
milkovsky

¿Cómo agrego los encabezados con API KEY?
Si8

@ Si8, consulte esta publicación stackoverflow.com/questions/5517281/…
milkovsky

178

Este código a continuación funciona para mí. Siempre uso solo comillas simples, y funciona bien. Le sugiero que use solo comillas simples o comillas dobles, pero no mezcle.

$.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
Gracias, sé enviar solicitud Ajax con encabezado personalizado. Mi problema es con un dominio diferente. Todos mis encabezados personalizados se colocan en Access-Control-Request-Headers. es solo seguridad en el navegador: dominio cruzado.
fingerup

Gracias, había establecido encabezados: "Autorización: Basic XXXXXX" accidentalmente, y iOS 9 / Safari 9 estaba lanzando SyntaxError DOM 12 en un proyecto.
Mark

44
¿Te refieres a comillas dobles o simples? No creo que nadie use corchetes dobles.
DBS

3
Las comillas dobles o simples (no "corchetes") no tienen nada que ver aquí.
Pere

su X-CSRF-TOKEN para Laravel 5.6 y superior
Abdul Rahman A Samad

12

Debido a que envía encabezados personalizados, por lo que su solicitud CORS no es una solicitud simple , por lo que el navegador primero envía una solicitud OPTIONS de verificación previa para verificar que el servidor permita su solicitud.

Ingrese la descripción de la imagen aquí

Si activa CORS en el servidor, su código funcionará. También puedes usar JavaScript fetch en su lugar ( aquí )

Aquí hay una configuración de ejemplo que se enciende CORS en nginx (archivo nginx.conf):

Aquí hay una configuración de ejemplo que se enciende CORS en Apache (archivo .htaccess)


3

Y es por eso que no puedes crear un bot con JavaScript, porque tus opciones están limitadas a lo que el navegador te permite hacer. No puede simplemente ordenar un navegador que siga el CORS política , que la mayoría de los navegadores siguen, para enviar solicitudes aleatorias a otros orígenes y permitirle obtener la respuesta de manera simple!

Además, si trató de editar algunos encabezados de solicitud manualmente, como origin-headerlas herramientas de desarrolladores que vienen con los navegadores, el navegador rechazará su edición y puede enviar una OPTIONSsolicitud de verificación previa.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.