当AJAX请求获得“302 Moved”响应时会发生什么?

时间:2012-10-29 21:07:04

标签: jquery ajax google-chrome http-status-code-302

我正在尝试AJAXify一个旧的网站表单而不修改后端。最初,后端会在收到表单后回复“302 Moved”重定向到“谢谢”页面。

现在,当我尝试使用jQuery $ .ajax调用提交表单时,表单数据已成功提交,但“302 Moved”重定向似乎被浏览器取消,jQuery不知道发生了什么

我的问题是,无论发生什么,$ .ajax调用都会返回错误并且status = 0,所以我无法区分成功提交和错误。

有没有办法阻止浏览器尝试关注重定向,或者至少找回正确的响应代码? (我正在使用Chrome。)

5 个答案:

答案 0 :(得分:1)

我认为不,你不能在不改变后端的情况下这样做。你必须改变响应头,让Ajax知道/理解该怎么做。如果你做了重定向,你必须改变标头,因为Ajax调用响应不会这样做。

答案 1 :(得分:0)

这可以让你朝着正确的方向前进吗?

$.ajax({
    type: "GET",
    url: url,
    data: data,
    complete: function(e, xhr, settings){
       if(e.status === 200){
            console.log(e.responseText);
       }else{
            console.log("error");
       }
   }
   });

答案 2 :(得分:0)

您的后端应用程序可能具有相对重定向,可能以某种方式不被jquery ajax处理。在这种情况下,位置标头不会包含域名,只是相对路径。对于一些人(我不清楚;))原因,它可能会导致相同的原产地政策问题。什么是有趣的,改变重定向到绝对路径应该解决问题。在jQuery 1.11.1上测试过。

使用代码描述:

理论上的ajax电话:

$.ajax({
    'url': '/your-url',
    'method': 'post',
    'data': form.serialize()
}).done(function(data) {
    // something
}).fail(function(jqXHR, textStatus, errorThrown) {
    // another something
});

所以在/ your-url控制器中你可能有类似的东西:

return $this->response->redirect('//same.domain/path');

return $this->response->redirect('/path');

第一个将工作。第二个不是。

因此?

关键是你可能需要改变后端,但只需要一点点。如果你真的不想和/或以不同的方式处理它,你不需要检查XmlHttpRequest的请求。

答案 3 :(得分:0)

Ajax代码如下所示:

$.ajax({
'url': '/your-url',
'method': 'post',
'data': form.serialize()
}).done(function(data) {
    // something
  }).fail(function(jqXHR, textStatus, errorThrown) {
if (jqXHR.getResponseHeader('Location') != null)
{ 
 window.Location= jqXHR.getResponseHeader('Location');
 }
 // other conditions in failure situation.
});

答案 4 :(得分:0)

检查表单是否为{{csrf_field()}}。这是在没有令牌的情况下提交表单时引起的。