origin has habilitar from domain cross control been allow javascript wcf jquery cors

javascript - has - xmlhttprequest cors



CORS-¿Cómo ''prevuelo'' una httprequest? (2)

Estoy tratando de hacer 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: Cómo lograr que CORS funcione

En el lado del servidor, mi método web está agregando ''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-Origin

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

¡Gracias!


Aunque este hilo se remonta a 2014, el problema aún puede ser actual para muchos de nosotros. Aquí es cómo lo traté en un contexto jQuery 1.12 / PHP 5.6:

  • jQuery envió su solicitud XHR usando solo encabezados limitados; solo se envió ''Origen''.
  • No se necesitó 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.

Muestra de código PHP:

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/.net$@'')) 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 agregue una exit; ya que no se necesita verificación previa.


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 realiza una solicitud con los siguientes encabezados:

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

Su servidor debería 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

Preste especial atención al encabezado de respuesta de Control de acceso-Permitir-Encabezados. 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/