La siguiente tabla ofrece los resultados de la detección homóloga en relación con http://store.comPany.com/dir/page.html:
Para resolver problemas de dominio cruzado, podemos usar los siguientes métodos:
1. Dominio cruzado a través de JSONP
En JS, no es posible solicitar datos directamente en diferentes dominios utilizando XMLHTTPREQUEST. Sin embargo, está bien introducir archivos de script JS en diferentes dominios en la página, y JSONP usa esta función para lograrlo.
Por ejemplo, está la página A.HTML, y el código en TI debe usar AJAX para obtener datos JSON en un dominio diferente. En a.html eso es todo:
Vemos que hay un parámetro de devolución de llamada después de la dirección de la adquisición de datos. Por supuesto, si la página de dirección JSONP para obtener datos no es controlada por usted, debe operar de acuerdo con el formato especificado de la parte que proporciona los datos.
Debido a que se presenta como un archivo JS, la devolución de http://example.com/data.php debe ser un archivo JS ejecutable, por lo que el código PHP de esta página puede verse así:
El resultado final de la salida de esa página es:
Entonces, el archivo JS obtenido a través de http://example.com/data.php?callback=Dosomething es la función de dos tendos que definimos antes, y sus parámetros son los datos JSON que necesitamos, por lo que obtenemos el dominio cruzado que necesitamos datos.
De esta manera, el principio de JSONP es muy claro. pasado como parámetros. Por lo tanto, JSONP requiere que la página del lado del servidor coopere en consecuencia.
Después de conocer el principio del dominio cruzado de JSONP, podemos usar JS para generar dinámicamente etiquetas de script para operaciones de dominio cruzado, sin escribir deliberadamente etiquetas de script manualmente. Si su página usa jQuery, entonces el método de encapsulación se puede usar para realizar operaciones JSONP muy convenientemente.
El principio es el mismo, excepto que no necesitamos insertar etiquetas de script manualmente y definir la función de nuevo. JQuery generará automáticamente una función global para reemplazar el signo de interrogación en Callback =?, y luego destruirá automáticamente los datos después de obtenerlo. El método $ .getJson determinará automáticamente si es un dominio cruzado. Carga de archivos JS.
2. Cross subdominio modificando documento. Domain
Los navegadores tienen una política homóloga, y una de sus limitaciones es que en el primer método dijimos que los documentos de diferentes fuentes no se pueden solicitar a través del método AJAX. Su segunda limitación es que la interacción JS no se puede realizar entre marcos de diferentes dominios en el navegador. Una cosa a tener en cuenta es que diferentes marcos (padre e generación de hijo o pares) pueden obtener los objetos de la ventana del otro, pero el dolor es que no puede usar las propiedades y métodos de los objetos de ventana obtenidos (método posterior a HTML5 es una excepción. Algunos navegadores como IE6 también pueden usar algunos atributos como Top y Parent). Por ejemplo, hay una página cuya dirección es http://www.example.com/a.html. Esta página tiene diferentes dominios del marco de iframe dentro de ella, por lo que no podemos obtener cosas en el iframe escribiendo el código JS en la página:
En este momento, Document.domain puede ser útil. Contáctalo en el mismo nombre de dominio. Pero debe tenerse en cuenta que la configuración del documento. Domain es limitado. Por ejemplo: el domain de documento de un documento en abexample.com se puede establecer en cualquiera de abexample.com, b.example.com y ejemplo.com, pero no se puede establecer en CabExample.com, porque se trata de un niño Del dominio de dominio actual, no puede configurarlo en baidu.com, porque el dominio principal ya no es el mismo.
Establezca documento.domain en la página http://www.example.com/a.html:
Document.domain también se establece en la página http://example.com/b.html, y esto también es necesario.
De esta manera, podemos acceder a varias propiedades y objetos en el Iframe a través de JS.
Sin embargo, si desea solicitar directamente la página http://example.com/b.html a través de Ajax en http://www.example.com/a.html, incluso si establece el mismo documento.domain, todavía no funcionará. Si desea interactuar con páginas de diferentes subdominios a través del método AJAX, además de usar el método JSONP, también puede usar un iframe oculto para actuar como un proxy. El principio es dejar que este iframe cargue una página con el mismo dominio que la página de destino que desea obtener datos a través de AJAX, por lo que la página en este iframe puede usar AJAX para obtener los datos que desea normalmente, y luego a través de nosotros que acabo de mencionar. que el método de modificar documento. Domain nos permite controlar completamente este iframe a través de JS, para que podamos dejar que el iframe envíe la solicitud AJAX, y también podemos obtener los datos recibidos.
3. Use Window.Name to Cross Dominio
El objeto de la ventana tiene un atributo de nombre, que tiene una característica: es decir, durante el ciclo de vida de una ventana, todas las páginas cargadas por la ventana comparten una ventana. y permisos de escritura, ventana. El nombre persiste en todas las páginas cargadas por una ventana, y no se restablecerá debido a la carga de páginas nuevas.
Por ejemplo: hay una página A.HTML, que contiene el siguiente código:
Echemos un vistazo al código de la página B.HTML:
3 segundos después de cargar la página A.HTML, salta a la página B.HTML y el resultado es:
Vemos que el valor establecido por su página anterior a.html a la ventana. El nombre se obtuvo con éxito en la página B.HTML. Si todas las páginas cargadas no han modificado la ventana. Por supuesto, si es necesario, cualquiera de las páginas puede modificar el valor de Window.name. Tenga en cuenta que el valor de la ventana. El nombre solo puede ser en forma de cadena.
En el ejemplo anterior, las páginas A.HTML y B.HTML que utilizamos están en el mismo dominio, pero incluso si A.HTML y B.HTML están en diferentes dominios, la conclusión anterior también es aplicable, que es exactamente la misma. El principio del dominio cruzado usando Window.name.
Echemos un vistazo a cómo obtener datos a través de dominios a través de Window.name. Demos un ejemplo.
Por ejemplo, hay una página www.example.com/a.html, y debe usar JS en la página A.HTML para obtener los datos en otra página ubicados en un dominio diferente www.cnblogs.com/data.html .
El código en la página data.html es muy simple, que es establecer el valor de datos que la página A.HTML quiere obtener para el nombre de ventana actual. Código en data.html:
Entonces, en la página A.HTML, ¿cómo cargamos la página data.html? Obviamente, no podemos cargar directamente la página data.html cambiando Window.location en la página A.HTML, porque queremos obtener los datos en data.html, incluso si la página A.HTML no salta. La respuesta es usar un iframe oculto en la página A.HTML para actuar como intermediario, y el iframe obtiene los datos de datos.html, y luego A.html obtiene los datos obtenidos por el iframe.
Si un iframe que actúa como intermediario quiere obtener el conjunto de datos a través de Window.name of data.html, solo necesita establecer el SRC de este iframe en www.cnblogs.com/data.html. Entonces A.HTML quiere obtener los datos obtenidos por el iframe, es decir, para obtener el valor de la ventana de iframe.name, debe establecer el src de este iframe en el mismo dominio que la página a.html, de lo contrario con El anterior en la misma estrategia de origen, A.HTML no puede acceder a la propiedad Window.Name en el iframe. Este es todo el proceso de dominio cruzado.
Mire el código de la página A.HTML:
El código anterior es solo el código de demostración principal más simple. un proxy. También hay muchos códigos listos similares en Internet.
Dominio cruzado a través de Window.name, eso es todo.
4. Use la ventana recientemente introducida. Método de posesión en HTML5 para transferir datos a través de dominios
Window.PostMessage (Mensaje, Targetorigin) El método es una característica recientemente introducida de HTML5. , Ópera, etc. Todas las máquinas ya admiten el método de ventana.
El objeto de la ventana que llama al método de posmesor se refiere al objeto de la ventana que recibirá el mensaje. El mensaje que se recibe.
El objeto de la ventana que necesita recibir mensajes se puede obtener escuchando su propio evento de mensaje, y el contenido del mensaje se almacena en el atributo de datos del objeto de evento.
El envío mencionado anteriormente a otros objetos de ventana en realidad se refiere a la situación en la que una página tiene varios cuadros, porque cada cuadro tiene un objeto de ventana. Al discutir el segundo método, dijimos que el objeto de ventana de la otra parte se puede obtener entre marcos de diferentes dominios, y la ventana. El método de posesión también se puede utilizar. Aquí hay un ejemplo simple con dos páginas
El resultado que obtenemos después de ejecutar una página:
Vimos esa página B recibió el mensaje con éxito.
Es bastante intuitivo y conveniente usar postmessage para transmitir datos a través de dominios, pero la desventaja es que IE6 e IE7 no lo admiten, por lo que si usarlo o no depende de las necesidades reales.