2010-11-22 23 views
8

Tengo una página en domain.com que hace una solicitud JSONP ajax (usando la función jQuery's .getJSON()) a una URL en anotherdomain.com. Pensé (léase: asumí) que el recurso en anotherdomain.com tendría acceso del lado del servidor a las cookies establecidas en ese dominio, pero ese no parece ser el caso?Cookie Access sobre JSONP

La llamada ajax se realiza específicamente para acceder a una cookie en particular, realizar una manipulación de los datos y devolver un amplio conjunto de información codificado por el valor de la cookie. El dominio original no tiene acceso directo al valor de la cookie, así que pensé que una solicitud ajax mantendría el estado que necesito.

¿Qué parte esencial de la información sobre cookies estoy pasando por alto? Estoy agotado y simplemente no lo estoy viendo.

Gracias.

ACTUALIZACIÓN

he encontrado una manera de hacerlo, pero parece JSONP a mi ojo, por lo que me pregunto por qué esta forma de trabajar, mientras que la versión Ajax no lo hace. ¿La solicitud está desconectada de la sesión del navegador para que no se pueda acceder a las cookies?

<script type="application/x-javascript" src="<?php echo $service_url . '&callback=interests' ?>"></script> 
<script type="text/javascript"> 
    function interests(data) { 
    $(function() { 
     var c_behaviors = data.length; 
     var ids   = []; 

     for(var i = 0; i < c_behaviors; i++) { 
     ids.push(data[i].behavior_id); 
     } 

     $('body').append('<p><label>Returned:</label> ' + ids.join(', ') + '</p>');  
    }); 
    } 
</script> 
+1

Estoy seguro de que se ha triplicado comprobó esto, pero ¿qué tan seguro está de que la cookie fue establecida por otrodominio.com? Además, ¿cuál es el estado de la cookie que se está configurando, como la caducidad, la ruta, etc. –

+0

Sí. Si alerté a la URL objetivo antes de la llamada ajax y luego cargo la URL objetivo en una nueva pestaña, obtengo exactamente lo que espero obtener. Parece que la llamada de Ajax está más desconectada de la sesión del navegador de lo que pensaba. –

+0

Pruebe la llamada $ .ajax con el tipo "json" y vea qué tipo de resultados obtiene. Por cierto, su enfoque JSONP fue documentado http://stackoverflow.com/questions/1421245/make-getjson-in-jquery-to-pass-cookies-to-external-domain y funcionó para otra persona también –

Respuesta

9

The same origin policy applies a todas las peticiones Ajax, por lo que si el dominio está accediendo en una llamada AJAX es diferente que el dominio cargado en el navegador (document.host), todas las cookies asociadas con el dominio de la URL solicitada no lo hará ser enviado. Por lo tanto, el enfoque JSONP funciona porque escribe una nueva etiqueta de script en la ventana, que se comportará como cualquier solicitud de recursos que un navegador pueda hacer a un dominio externo (pasando todas las cookies asociadas al dominio en la url). También lo he confirmado simplemente llamando al $.post("http://atdmt.com") desde mi consola de Chrome, mientras que en stackoverflow.com en el navegador (el único otro dominio que tenía cookies en mi navegador, mientras escribía la respuesta) y no envió ninguna cookie en el solicitar encabezados

Otra solución para evitar el problema de mantener el estado de anotherdomain.com sería tener anotherdomain.com establecer una cookie primera parte (si no se establece el atributo de dominio de la cookie) y cuando una ajax/La solicitud json se realiza a otrodominio.com acceda a esas cookies a través de javascript y solicítelas mediante parámetros HTTP estándar.

Espero que haya ayudado.

1

He encontrado el mismo problema antes. El problema que encontré es que la mayoría de los navegadores no le permiten ESTABLECER una sesión (es decir, establecer una cookie de sesión) cuando no se cumple la misma política de origen.