with statuscode example jquery ajax redirect header http-status-code-302

statuscode - redirect with jquery ajax



encabezado de respuesta jQuery y AJAX (7)

+1 a PleaseStand y aquí está mi otro truco:

después de buscar y encontré que la "solicitud cruzada ajax" no podía obtener encabezados de respuesta del objeto XHR, me di por vencido. y use iframe en su lugar.

1. <iframe style="display:none"></iframe> 2. $("iframe").attr("src", "http://the_url_you_want_to_access") //this is my aim!!! 3. $("iframe").contents().find(''#someID'').html()

Así que tengo esta llamada jQuery AJAX, y la respuesta proviene del servidor en forma de un redireccionamiento 302. Me gustaría tomar esta redirección y cargarla en un iframe, pero cuando trato de ver la información del encabezado con una alerta de javascript, aparece nulo, aunque Firebug lo vea correctamente.

Aquí está el código, si sirve de ayuda:

$j.ajax({ type: ''POST'', url:''url.do'', data: formData, complete: function(resp){ alert(resp.getAllResponseHeaders()); } });

Realmente no tengo acceso a las cosas del lado del servidor para mover la URL al cuerpo de la respuesta, que sé que sería la solución más fácil, por lo que cualquier ayuda con el análisis del encabezado sería fantástica.


El objeto subyacente XMLHttpRequest utilizado por jQuery siempre seguirá de forma silenciosa los redireccionamientos en lugar de devolver un código de estado 302. Por lo tanto, no puede usar la funcionalidad de solicitud AJAX de jQuery para obtener la URL devuelta. En su lugar, debe poner todos los datos en un formulario y enviar el formulario con el atributo de target establecido en el valor del atributo de name del iframe:

$(''#myIframe'').attr(''name'', ''myIframe''); var form = $(''<form method="POST" action="url.do"></form>'').attr(''target'', ''myIframe''); $(''<input type="hidden" />'').attr({name: ''search'', value: ''test''}).appendTo(form); form.appendTo(document.body); form.submit();

La página url.do del servidor se cargará en el iframe, pero cuando llegue su estado 302, el iframe será redirigido al destino final.


La desafortunada verdad sobre AJAX y el redireccionamiento 302 es que no se pueden obtener los encabezados de la declaración porque el navegador nunca los entrega al XHR. Cuando un navegador ve un 302, automáticamente aplica la redirección. En este caso, vería el encabezado en Firebug porque el navegador lo obtuvo, pero no lo vería en ajax, porque el navegador no lo pasó. Esta es la razón por la cual nunca se llama a los manejadores de errores y de éxito. Solo se llama al manejador completo.

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

Aquí hay algunas publicaciones de sobre el tema. Algunas de las publicaciones describen hacks para evitar este problema.

Cómo administrar una solicitud de redireccionamiento después de una llamada jQuery Ajax

Catching 302 ENCONTRADO en JavaScript

Redirección HTTP: 301 (permanente) vs. 302 (temporal)


La solución de cballou funcionará si está utilizando una versión anterior de jquery. En versiones más nuevas también puedes probar:

$.ajax({ type: ''POST'', url:''url.do'', data: formData, success: function(data, textStatus, request){ alert(request.getResponseHeader(''some_header'')); }, error: function (request, textStatus, errorThrown) { alert(request.getResponseHeader(''some_header'')); } });

Según documentos, el objeto XMLHttpRequest está disponible a partir de jQuery 1.4.


Si se trata de una solicitud CORS , puede ver todos los encabezados en herramientas de depuración (como Chrome-> Inspeccionar elemento-> Red), pero el objeto xHR solo recuperará el encabezado (a través de xhr.getResponseHeader(''Header'') ) si tal un encabezado es un encabezado de respuesta simple :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

Si no está en este conjunto, debe estar presente en el Access-Control-Expose-Headers devuelto por el servidor.

Sobre el caso en cuestión, si se trata de una solicitud CORS, solo se podrá recuperar el encabezado Location través del objeto XMLHttpRequest si, y solo si, el encabezado siguiente también está presente:

Access-Control-Expose-Headers: Location

Si no es una solicitud CORS, XMLHttpRequest no tendrá problemas para recuperarla.


prueba esto:

type: "GET", async: false, complete: function (XMLHttpRequest, textStatus) { var headers = XMLHttpRequest.getAllResponseHeaders(); }


var geturl; geturl = $.ajax({ type: "GET", url: ''http://....'', success: function () { alert("done!"+ geturl.getAllResponseHeaders()); } });