jQuery AJAX看到重定向为状态200而不是302?

时间:2009-08-12 19:18:30

标签: jquery asp.net-mvc http-status-code-302

我正在使用jQuery和jQuery.form插件来提交我的表单(也使用ASP.Net MVC)。

问题是用户位于使用表单身份验证的网站部分,如果他们的身份验证cookie在页面上的时间到期而不是返回状态302,这将是重定向到登录页面,我仍然得到200?

在FireBug中,我看到302 Found,然后我的登录页面将作为200发送,这是发送回我的A​​jax调用的状态代码。如果我从未看到302发送回jQuery表单插件,如何检测到它们已被注销?

5 个答案:

答案 0 :(得分:9)

我真的很喜欢这个解决方案。通过将ajax请求的302响应更改为401,它允许您在客户端设置ajax以监视查找401的任何ajax请求,以及是否找到重定向到登录页面的请求。非常简单有效。

的Global.asax:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 &&
        Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

客户端代码:

 $(function () {
      $.ajaxSetup({
        statusCode: {
          401: function () {
            location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
          }
        }
      });
    });

答案 1 :(得分:1)

尝试使用缓存:false cache option in jquery ajax

$.ajax({
  url: "test.html",
  cache: false,
  success: function(html){
    $("#results").append(html);
  }
});

--- EDIT 在C#代码中尝试使用它:

protected void Page_Load(object sender, System.EventArgs e)
{
   Response.Cache.SetCacheability(HttpCacheability.NoCache);
   ...
}

答案 2 :(得分:0)

之前遇到过类似的问题。 solution given in this question有用吗?

答案 3 :(得分:0)

这是我过去使用的解决方案:

服务器端:

当我检查会话是否仍然有效时,我也会留意“X-Requested-With”标头,如果您使用的是jQuery,则应该是“XMLHttpRequest”(注意:IE倾向于以小写形式返回标题名称,因此也要注意这一点。如果会话确实已经过期并且标头存在,而不是使用HTTP重定向,我会使用这样的简单JSON对象进行响应:

{ "SESSION": "EXPIRED" }

客户方:

在我的onload代码中,我使用jQuery的ajaxComplete事件来检查会话过期对象的所有传入请求有效负载。代码看起来像这样:

$(window).ajaxComplete(function(ev, xmlhr, options){
    try {
        var json = $.parseJSON(xmlhr.responseText);
    }
    catch(e) {
        console.log('Session OK');
        return;
    }

    if ($.isPlainObject(json) && json.SESSION == 'EXPIRED') {
        console.log('Session Expired');

        //inform the user and window.location them somewhere else

        return;
    }

    console.log('Session OK');
});

答案 4 :(得分:0)

我很确定你永远不会在XHR对象的完成状态下得到302。如果发生重定向,则连接仍在进行中,直到您看到登录页面的响应(如果存在,则应为200)。

但是,为什么你需要看302?当然,如果您正在重定向到login.php,那么只需获取返回响应的url(或解析内容)就会告诉您它们已经注销了吗?

另一种方法是,只有在会话过期时(在执行某些操作之前)才知道,是使用setTimeout或类似方法轮询服务器以获取有关身份验证状态的信息。

祝你好运。