2008-12-31 25 views
22

No he podido encontrar nada particular de esta situación en línea, así que aquí voy ... Necesito establecer/obtener las cookies almacenadas en "first.com" mientras navego por "second.com", tengo acceso completo a "first.com" pero solo tengo acceso de JavaScript (puedo manipular el DOM como quiera) en "second.com".Obtener cookies de configuración en diferentes dominios, con javascript u otro

Mi primer acercamiento fue crear un iframe en second.com (con js) que carga una página como "first.com/doAjax?setCookie=xxx" y que hizo una llamada ajax decir "first.com/setCookie ? cookieData = xxx "que establecería la cookie en" first.com "con los datos que transmitimos.

Eso funcionó bastante bien para configurar la cookie en first.com desde second.com: para obtener una cookie básicamente seguí el mismo procedimiento, creé el iframe que cargó "first.com/doAjax?getCookie" y eso haga una llamada ajax para decir "first.com/getCookie" que leería la información de la cookie en first.com y la devolvería como un objeto JSON.

El problema es que no puedo volver a poner el objeto cookie JSON en "second.com" para poder leerlo, así que tal vez podría traerlo cuando la llamada Ajax se complete usando "window.top" pero hay problemas de sincronización porque no es relativo a cuándo se cargó el iframe. Espero que esté claro y me preguntaba si hay una solución más fácil en lugar de este loco iframe-> ajax, también parece que esto ni siquiera funcionará para obtener cookies en SAFARI.

+0

Solo una nota de que esto es realmente inseguro ya que cualquiera podría establecer y obtener cookies para first.com –

+0

@Luca Y si el usuario tuviera cookies de terceros deshabilitadas, ni siquiera podrá establecerlas en el iframe en primer lugar. – Pacerier

Respuesta

9

Puede insertar un elemento de script en HEAD del documento con una devolución de llamada que pase la cookie que necesita a cualquier función que lo necesite.

Algo así como:

<script type="text/javascript"> 
    var newfile=document.createElement('script'); 
    newfile.setAttribute("type","text/javascript"); 
    newfile.setAttribute("src", 'http://first.com/doAjax?getCookie&callback=passCookie'); 
    document.getElementsByTagName("head")[0].appendChild(newfile); 
</script> 

Y el first.com/doAjax?getCookie página podrían hacer esto:

 passCookie({'name':'mycookie', 'value':'myvalue'}); 
+3

Aparentemente este método solo funciona en Firefox, lo probé en Safari e IE6, ambos parecían no ser capaces de establecer/obtener cookies ... –

+0

No puedo usar la etiqueta de script para leer las cookies de un dominio diferente, ¿verdad? Necesito estar realmente en first.com para leer sus cookies, no puedo agregar una etiqueta de script a second.com para obtener el cookieData ... por lo tanto, necesito usar un iframe, o no lo sé ... Tal vez no entiendo tu respuesta, házmelo saber. –

+0

No está técnicamente utilizando una etiqueta de secuencia de comandos para leer los valores de las cookies, la secuencia de comandos se incluye en su página, por lo tanto, está en el mismo alcance y puede llamar a cualquier función en second.com –

0

poner este archivo PHP a first.com:

//readcookie.php  
echo $_COOKIE['cookiename']; 

En second.com puede utilizar este javascript para obtener el valor:

function readCookieCallback() 
{ 
    if ((this.readyState == 4) && (this.status == 200)) 
    { 
    alert("the value of the cookie is: "+this.responseText); 
    } 
    else if ((this.readyState == 4) && (this.status != 200)) 
    { 
    //error... 
    } 
} 


function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.onreadystatechange = readCookieCallback; 
    refreshObject.open("GET", "http://www.first.com/readcookie.php"); 
    refreshObject.send(); 
} 

Saludos, Robert

+0

Im capaz de OBTENER cookies bien con el método proporcionado por Ryan Doherty, parece que también establece cookies en la mayoría del navegador excepto Safari. –

+1

Esto no funcionó para mí. Recibí la respuesta en Chrome: XMLHttpRequest no puede cargar https://second.com/test.php. Origen https://first.com no está permitido por Access-Control-Allow-Origin. – Volomike

+0

Eso es un problema CORS. No relacionado con el problema de las cookies. – germs12

-2

para el ajuste de las cookies puede cambiar mi script de la siguiente manera:

El nuevo PHP-Script:

//writecookie.php 
setcookie($_GET['c'], $_GET['v']); 

Y el JavaScript:

function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.open("GET", "http://www.first.com/writecookie.php?c=cookiename&v=cookievalue"); 
    refreshObject.send(); 
} 

Eso debería funcionar en todos los navegadores.

+4

No, las llamadas ajax no están permitidas entre dominios ... –

+0

@LucaMatteis ... siempre que CORS (http://dev.w3.org/2006/waf/access-control/) no esté habilitado. – Stephan

Cuestiones relacionadas