2010-03-08 14 views
18

Me encuentro con problemas de política del mismo origen en Javascript. He leído sobre una solución para esto usando la variable document.domain, pero no puedo hacer que la solución funcione. La solución consiste en que se supone que puede establecer document.domain en 'example.com', de modo que si ejecuta el código desde foo.example.com, puede cargar datos a través de XHR desde bar.example.com.Solución de política del mismo origen que utiliza document.domain en Javascript

detalles sobre la solución está aquí:

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

Mi ejemplo de código - que no produce los resultados deseados - se ejecuta desde una URL como http://foo.example.com/:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
<script> 
document.domain = 'example.com'; 
window.onload = function() { 
    var req = new XMLHttpRequest(); 
    var url = 'http://bar.example.com/'; 
    req.open('GET', url, true); 
    req.onreadystatechange = function (aEvt) { 
     if (req.readyState == 4) { 
      var elem = document.getElementById('result'); 
      if (req.status == 200) { 
       var data = req.responseText; 
      } else { 
       var data = "Error loading page: " + req.status; 
      } 
      elem.innerHTML = data; 
     } 
    }; 
    req.send(null); 
}; 
</script> 
Result:<hr> 
<div id="result"></div> 
</body> 
</html> 

La salida de este código:

 
Result: 
Error loading page: 0 

Si cambio url a 'http://foo.example.com/', todo funciona correctamente. ¿Hay algún error en mi código de ejemplo?

No quiero usar un proxy porque son más lentos, menos eficientes y aumentarán el tráfico en nuestro servidor web. Sería genial si esta solución funcionara realmente. ¿Es esta solución "pastel en el cielo"?

Respuesta

3

Dado que Mic respondió por qué no funciona, pensé que compartiría la solución para "cómo" hacer trabajo entre dominios. Ver mi publicación SO here.

+0

Gracias j0rd4n, este es exactamente el tipo de solución no proxy que estaba buscando, incluso si estaba ladrando el árbol equivocado con document.domain. Encontré un poco más de información sobre el esquema que ellos llaman JSONP y cómo jQuery también tiene incorporada esta funcionalidad, que está fuera del alcance de mi pregunta, pero no obstante es interesante: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix

+0

El proceso que menciono usa JSONP pero lo hace en un sentido manual. jquery se encargará de la "recepción" de JSONP en el DOM de JavaScript, pero aún debe proporcionar un servicio que devuelva el texto JSONP. Al final del día, su página de servidor debe devolver JSONP formateado. Su JavaScript (ya sea jquery, ext-js, etc.) debe realizar la llamada para ejecutar el script dentro de una etiqueta de script. –

21

document.domain permite la comunicación entre fotogramas/iframes. No XHR.

<body> 
<iframe src="http://bar.example.com/"></iframe> 
<script> 
    document.domain = 'example.com'; 
    var ifr = document.getElementsByTagName('IFRAME')[0]; 
    ifr.onload = function(e){ 
     //will log the string "BODY" in the console 
     console.log(ifr.contentWindow.document.body.tagName); 
    }; 
</script> 
</body> 

Si se quita la línea con document.domain, la lectura del contenido de la contentWindow lanzará el error de política del mismo origen.

+0

Lo intenté. Estableciendo document.domain en Chrome return error de red. Las herramientas de desarrollo cuentan el mismo problema de política de origen. – user2284570

+1

¿Intentó establecer 'document.domain' en el mismo valor tanto en el dominio principal como en el subdominio? Si no, esto causa un error. – Mic

+0

Supongo que es porque el iframe es completamente un dominio diferente. – user2284570

Cuestiones relacionadas