2010-06-28 25 views
25

He configurado Cross-Origin Resource Sharing en un servidor (Jetty usando CrossOriginFilter) y funciona perfectamente en IE8 y Firefox. En Chrome, simplemente ... no.CORS no funciona en Chrome

$.ajax({ url : crossOriginURL, 
    type : "GET", 
    error : function(req, message) { 
     alert(message); 
    }, 
    dataType : "json" }); 

Se invoca la función de error, con el útil mensaje "error". Parece que está haciendo la solicitud, pero sin ninguno de los encabezados que esperarías. Si la URL es del mismo origen, funciona bien.

+0

Malvolio y se CuSS misma persona? – Cipi

+0

¡No! ¡Por supuesto no! LOL. Tuve el mismo problema que él hoy por la mañana. Era urgente para mí resolver eso, así que para no repetir la pregunta, me he valido de su pregunta, pero como la resolví ahora, tuve que responderla. Perdón por mi mal ingles. – CuSS

Respuesta

11

lo que finalmente funcionó para mí es xhr.setRequestHeader('Content-Type', 'text/plain');

+8

Para explicar esto un poco más completamente, el uso de datos "crudos" como este evita la comprobación previa que es más común con CORS. Como no hay vuelos previos, no hay controles de control de acceso, lo que evita todo el problema. +1 – Richard

+0

@Richard Eso es solo la mitad de lo correcto. Evita la comprobación previa, pero incluso las solicitudes CORS no preflighted pueden producir errores (por ejemplo, si no hay un encabezado de respuesta 'Access-Control-Allow-Origin: ...' coincidente. La razón por la que esto funciona es realmente muy simple: ' text/plain' es uno de los pocos tipos de contenido permitidos sin un encabezado de respuesta 'explicit * * Access-Control-Allow-Headers: Content-Type'.' json' (o 'application/json' requiere que el encabezado explícito permita . – CBHacking

+0

@CBHacking - siete malditos años después y alguien viene con la respuesta correcta. No sé si es bueno o malo que siete años después, y reviso el sitio web en dos horas. De todos modos, ¿por qué no? hacer una respuesta y puedo aceptarlo? – Malvolio

22

he resuelto mi problema de esta manera:

Agregar a su Código PHP:

header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Credentials: true "); 
header("Access-Control-Allow-Methods: OPTIONS, GET, POST"); 
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control"); 

O añadir estas cabeceras para su respuesta.

Problema: los navegadores preguntan al servidor por las opciones antes de su solicitud principal, para verificar si el sitio tiene la opción de permitir la comunicación con un origen diferente y, en caso afirmativo, realizan su solicitud POST o GET.

EDIT: Prueba esto (sin su corte) para ver si está recibiendo datos ...

$.ajax({ url : crossOriginURL, 
    type : "GET", 
    error : function(req, message) { 
     alert(message); 
    }, 
    success : function(data) { 
     alert(data); 
    }, 
    dataType : "text"}); 
+2

¿Puedes marcar como respuesta correcta, por favor? – CuSS

+0

En realidad, lo que finalmente funcionó para mí es xhr.setRequestHeader ('Content-Type', 'text/plain'); – Malvolio

+4

En ese caso, ¿puedes publicar tu propia respuesta y marcar ESA como la correcta? (No tengo este problema en particular, pero me gusta mantener limpia la lista de preguntas sin respuesta) – ssokolow

12

Parece que el cartel original puede haber resuelto su problema, pero para cualquiera que tenga el mismo problema que el comentarista o Elisabeth, creo que el problema puede ser que Chrome se niega a establecer un encabezado Origin para una solicitud CORS si está ejecutando la solicitud desde un archivo local. Ni siquiera le permitirá anular explícitamente el encabezado de origen. Esto hace que el servidor vea "Origen: nulo", lo que da como resultado un 403 en la mayoría de los casos. Firefox aparentemente no tiene tal restricción, como he descubierto después de mucho tirón de pelo.

Si necesita utilizar Chrome en este caso, puede resolver su problema ejecutando un servidor web localmente y siempre accediendo a su archivo a través de http: en lugar de a través de un archivo :.

+2

Se puede obtener una resolución menos intrusiva (aunque temporal) al ejecutar Chrome con seguridad de origen cruzado * desactivado *: 'ruta/a/chrome --disable-web-security'. * * Advertencia **: si continúa utilizando Chrome no seguro para su navegación habitual, o no sucederá nada o Su cuenta bancaria será pirateada, así que buena suerte con eso. – Malvolio

+0

¡Esto realmente me salvó el día! Tan pronto como puse la solicitud de origen detrás de un simple servidor web, todo estaba bien. –

-4

CORS funcionará en cromo. Simplemente use chrome is safe-mode, es decir, use disable settings de seguridad. Busca en Google al respecto, o incluso puedes comenzar desde la línea de comandos también.

+14

No es una buena solución porque (a) es inherentemente * un * -seguro, (b) requiere que el usuario detenga Chrome y luego lo reinicie antes de que mi sitio funcione, y (c) necesité la solución * tres ¡hace años que!* – Malvolio

0

En mi caso, es localhost: 8001 (el front-end) que intenta llamar a las API en localhost: 7001 (en server.js como servidor de nodo). Incluso tenía el complemento CORS instalado y encendido en Chrome, pero la política CORS los rechazó como casos de verificación previa.

Me tomó más de medio día resolver el problema finalmente. Aquí están los pasos "estúpidos", créalo o no:

i. APAGUE el complemento CORS, vuelva a cargar la aplicación, en este momento aún debería obtener los errores correctos.

ii. Vuelva a encenderlo, vuelva a cargar la aplicación, si las API son exitosas, deténgase aquí, no es necesario que proceda a iii.

iii. Sin embargo, si sigues recibiendo el rechazo de CORS, desinstala Chrome e instala un Chrome actualizado.

iv. En el nuevo Chrome, el complemento CORS instalado previamente debería estar allí pero con el estado OFF.

v. Recargue la página, debe obtener los mensajes de rechazo de CORS en la consola que sean correctos.

vi. Vuelva a encenderlo, vuelva a cargar la página, los errores deberían desaparecer.

No hay más ideas si los pasos anteriores aún no funcionan en su caso.

También probé el siguiente en server.js (nodo) y siguen sin funcionar, por lo que no se molestan en tratar:

var app = express(); 
var cors = require('cors'); // Already done “npm i cors --save-dev” 
app.options('*', cors()); 
Cuestiones relacionadas