【问题标题】:What happens when an AJAX request gets a "302 Moved" response?当 AJAX 请求得到“302 Moved”响应时会发生什么?
【发布时间】:2012-10-29 21:07:03
【问题描述】:

我正在尝试在不修改后端的情况下对旧网站表单进行 AJAX 化。最初,后端在收到表单后会响应“302 Moved”重定向到“thank you”页面。

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

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

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

【问题讨论】:

  • 任何不成功的事情对 jQuery 来说都是失败的。但是,您可以编写错误处理代码以正确返回 500 状态代码,然后您可以假设其他任何内容都是重定向。
  • 或者,您可以对表单处理程序页面进行编码,以检查它是否是 ajax 请求,如果是,则不要重定向。 X-Requested-With
  • 好主意,尽管我正在尝试在不更改遗留后端的情况下做到这一点。
  • 考虑到这一点,做一些会故意抛出 php 错误并查看它返回的内容。它可能已经返回 500

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


【解决方案1】:

我认为不,如果不更改后端,您将无法做到这一点。您必须更改响应标头,以便 Ajax 知道/理解该做什么。如果您进行了重定向,则必须更改标头,因为 Ajax 调用响应不会这样做。

【讨论】:

  • 应该把响应头改成什么?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您的后端应用程序可能具有相对重定向,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。

    【讨论】:

      【解决方案4】:

      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.
      });
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-27
          • 1970-01-01
          • 2013-10-22
          • 2012-11-21
          • 1970-01-01
          • 2018-08-08
          • 2012-06-24
          • 2015-05-31
          相关资源
          最近更新 更多