¿Existe alguna manera "segura" de verificar si la misma política de origen se aplica a una URL antes de intentar realmente utilizar los métodos ajax? Aquí es lo que tengo:
function testSameOrigin(url) {
var loc = window.location,
a = document.createElement('a');
a.href = url;
return a.hostname == loc.hostname &&
a.port == loc.port &&
a.protocol == loc.protocol;
}
Esta es una manera segura y fiable de hacerlo, siempre y cuando usted está haciendo (o más bien no hacer) ciertas cosas.
Este tipo de trabajo funciona, pero es una suposición manual basada en el artículo de la wikipedia.
Esto debería funcionar en las circunstancias "normales". Deberá modificarse si planea usar cross-domain scripting.
Si modifica document.domain
en sus scripts, por ejemplo de "foo.example.com" y "bar.example.com" a "ejemplo.com" su función testSameOrigin
volvería false
para 'http://example.com', cuando en realidad debería devolver true
.
Si está pensando en modificar document.domain
, puede agregar simplemente añadir un cheque por que en el script.
Si está planeando usar CORS (consulte el enlace anterior) para permitir la comunicación entre dominios, también devolverá un falso negativo. Pero si está utilizando CORS, tendrá una lista de dominios con los que se puede comunicar, y usted puede agregar esa lista a esta función también.
¿Hay una mejor manera de verificar previamente la asignación de dominio cruzado? jQuery está bien para usar.
Probablemente no
, aunque puede ser vale la pena mencionar que lo que está viendo en la consola de la respuesta de Steve podría ser el "dilema del observador" ... Esos errores parecen que son el resultado de la consola tratando de inspeccionar el otra ventana, no necesariamente desde la secuencia de comandos.
Suponiendo que no se está metiendo con document.domain
o usando CORS, su solución original es probablemente mejor, ya que no necesita hacer una solicitud adicional para determinar si el servidor está disponible o no. Incluso si está haciendo algunas secuencias de comandos de dominios cruzados, la mejor opción es modificar la función que tiene ahora para acomodarlo.
Si realiza una solicitud de dominio cruzado, fallará con 'readystate = 4' y' statuscode = 0', que es similar a una solicitud cancelada. Ya que necesita protegerse contra las solicitudes abortadas de todos modos, ¿por qué necesitaría este cheque? Siento que esta medida de seguridad se aplica desde el exterior, usted no tiene control sobre ella, por lo que cualquier verificación desde el entorno es, por definición, incorrecta. Así que no creo que deba verificarlo, solo deje que la solicitud falle. – Halcyon