2011-12-31 7 views
77

Estoy tratando de realizar una solicitud HTTP de dominio cruzado al servicio WCF (que yo poseo). He leído varias técnicas para trabajar con las limitaciones de secuencias de comandos de dominio cruzado. Debido a que mi servicio debe acomodar tanto las solicitudes GET como POST, no puedo implementar alguna etiqueta de script dinámica cuyo src sea la URL de una solicitud GET. Como soy libre de realizar cambios en el servidor, comencé a tratar de implementar una solución que implique la configuración de las respuestas del servidor para incluir el encabezado "Access-Control-Allow-Origin" y las solicitudes "prevuelo" con la solicitud OPTIONS. Obtuve la idea de esta publicación: Getting CORS workingCORS - ¿Cómo 'prevuelo' una httprequest?

En el lado del servidor, mi método web agrega 'Access-Control-Allow-Origin: *' a la respuesta HTTP. Veo que las respuestas sí incluyen este encabezado ahora. Mi pregunta es: ¿cómo 'preflight' una solicitud (OPCIONES)? Estoy usando jQuery.getJSON para hacer la solicitud GET pero el navegador cancela la solicitud de inmediato con el infame:

Origen http://localhost no está permitido por Access-Control-Allow-Origen

Hay alguien familiarizado con esta técnica CORS? ¿Qué cambios se deben realizar en el cliente para realizar una verificación previa de mi solicitud?

Gracias!

Respuesta

124

Durante la solicitud de verificación previa, debería ver los siguientes dos encabezados: Access-Control-Request-Method y Access-Control-Request-Headers. Estos encabezados de solicitud le piden al servidor los permisos para realizar la solicitud real. Su respuesta de verificación previa debe confirmar estos encabezados para que la solicitud real funcione.

Por ejemplo, supongamos que el navegador hace una petición con los siguientes encabezados:

Origin: http://yourdomain.com 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: X-Custom-Header 

Su servidor debe entonces responder con los siguientes encabezados:

Access-Control-Allow-Origin: http://yourdomain.com 
Access-Control-Allow-Methods: GET, POST 
Access-Control-Allow-Headers: X-Custom-Header 

prestar especial atención a la Access-Control Encabezado de respuesta de encabezados bajos. El valor de este encabezado debe ser el mismo encabezado en el encabezado de solicitud de Access-Control-Request-Headers, y no puede ser '*'.

Una vez que envíe esta respuesta a la solicitud de verificación previa, el navegador realizará la solicitud real. Puede obtener más información sobre CORS aquí: http://www.html5rocks.com/en/tutorials/cors/

+0

¿podría agregar varios dominios a Access-Control-Allow-Origin? – botbot

+0

@botbot Es probable que ya hayas resuelto esto, pero en caso de que otros se pregunten qué puede hacer 'Access-Control-Allow-Origin: * ' –

+2

, posiblemente me haya perdido algo. Entonces, ¿debería enviar dos solicitudes XMLHttp? Uno para la verificación previa; comprobar la respuesta en caso de éxito y luego enviar la consulta real? – Kangkan

0

Aunque este hilo se remonta a 2014, el problema puede seguir siendo actual para muchos de nosotros. Aquí es cómo se ocuparon de ello en un jQuery 1.12/PHP 5.6 contexto:

  • jQuery envió su solicitud XHR usando sólo los encabezados limitados; solo se envió 'Origen'.
  • No se necesita una solicitud de verificación previa.
  • El servidor solo tuvo que detectar dicha solicitud y agregar el "Control de acceso-Permitir-Origen:". $ _SERVER ['HTTP_ORIGIN'] encabezado, después de detectar que se trataba de un XHR de origen cruzado.

PHP Ejemplo de código:

if (!empty($_SERVER['HTTP_ORIGIN'])) { 
    // Uh oh, this XHR comes from outer space... 
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request 
    if (!preg_match('@\.partner\.domain\[email protected]')) 
     die("End of the road if you're not my business partner."); 

    // otherwise oblige 
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); 
} 
else { 
    // local request, no need to send a specific header for CORS 
} 

En particular, no añadir un exit; que no es necesaria ninguna verificación previa.

Cuestiones relacionadas