2012-02-07 14 views
72

Quiero utilizar jQuery para OBTENER una URL y comprobar explícitamente si respondió con un redireccionamiento 302, pero no siga la redirección.

jQuery's $.ajax parece que siempre sigue los redireccionamientos. ¿Cómo puedo evitar esto y ver el redireccionamiento sin seguirlo?

Existen varias preguntas con títulos como "jquery ajax redirect", pero todas parecen implicar el logro de algún otro objetivo, en lugar de simplemente verificar directamente el estado que da un servidor.

Respuesta

74

La solicitud AJAX nunca tiene la oportunidad de NO seguir la redirección (es decir, debe seguir la redirección). Más información se puede encontrar en esta respuesta https://stackoverflow.com/a/2573589/965648

11

jQuery se ejecuta dentro de los límites del motor de JavaScript de su navegador. Todos los recursos solicitados a través de los elementos javascript o html (enlace, script, imagen, audio o video, etc.) están sujetos a la redirección HTTP. Desafortunadamente, no hay forma de que javascript obtenga acceso a http de bajo nivel de la manera que lo necesitaría.

Lo siento, la respuesta es no.

4

Mientras que las otras personas que respondieron a esta pregunta son (por desgracia) correcta que esta información se nos oculta por el navegador, pensé que había puesto una solución que se me ocurrió:

he configurado mi servidor de aplicaciones para establecer un encabezado de respuesta personalizado (X-Response-Url) que contenga la url que se solicitó. Cada vez que mi código ajax recibe una respuesta, comprueba si está definido xhr.getResponseHeader("x-response-url"), en cuyo caso lo compara con la URL que solicitó originalmente a través del $.ajax(). Si las cadenas de texto difieren, sé que hubo una redirección y, además, a qué url llegamos en realidad.

Esto tiene el inconveniente de requerir alguna ayuda del lado del servidor, y también puede descomponerse si la URL se manda (debido a problemas de cotización/codificación, etc.) durante el viaje de ida y vuelta ... pero en el 99% de los casos, esto parece hacer el trabajo.


En el lado del servidor, mi caso concreto ha sido una aplicación Python utilizando el framework de desarrollo web de la pirámide, y utiliza el siguiente fragmento:

import pyramid.events 

@pyramid.events.subscriber(pyramid.events.NewResponse) 
def set_response_header(event): 
    request = event.request 
    if request.is_xhr: 
     event.response.headers['X-Response-URL'] = request.url 
27

Bienvenido al futuro!

Ahora tenemos una propiedad "responseURL" del objeto xhr. ¡HURRA!

Ver How to get response url in XMLHttpRequest?

Sin embargo, jQuery (al menos 1.7.1) no da un acceso al objeto XMLHttpRequest directamente. Puede usar algo como esto:

var xhr; 
var _orgAjax = jQuery.ajaxSettings.xhr; 
jQuery.ajaxSettings.xhr = function() { 
    xhr = _orgAjax(); 
    return xhr; 
}; 

jQuery.ajax('http://test.com', { 
    success: function(responseText) { 
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText); 
    } 
}); 

No es una solución limpia y supongo equipo de jQuery hará algo para responseURL en las futuras versiones.

CONSEJO: simplemente compare la URL original con responseUrl. Si es igual, entonces no se dio ninguna redirección. Si está "indefinido", entonces responseUrl probablemente no sea compatible.Sin embargo, como dijo Nick Garvey, la solicitud de AJAX nunca tiene la oportunidad de NO seguir el redireccionamiento, pero puede resolver una serie de tareas utilizando la propiedad responseUrl.

-11
$.ajax({ 
type: "POST", 
url: "http://arudhrainnovations.com/android/testregister.php", 
data: dataString, 
dataType: "json", 
cache: false, 
success: function(result){ 
     alert(result); 
     } 
} 
if (result.success==1) 
{ 
    windows.locations = "index.html"; 
    return; 
} 

Para redirigir el archivo después de la respuesta json del servidor activo. compruebe la etiqueta responde success ==1 y coloque el siguiente código para la redirección.

windows.locations = "index.html";

Por favor, hágamelo saber más detalles en [email protected]

+1

Este código será nunca trabajar bro ... – brothers28

+0

Buena suerte con eso –