2009-08-12 183 views
10

我使用jQuery和jQuery.form插件来提交我的表单(也使用ASP.Net MVC)。jQuery AJAX看到重定向为状态200不是302?

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

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

+0

您是否尝试过检查的权威性饼干吗?似乎更容易检查cookie来检测用户是否已登录。 – user120242 2009-08-13 02:32:34

回答

0

尝试缓存:假cache option in jquery ajax

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

---编辑 这种尝试在C#代码:

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

同样的结果 - 我看到在萤火虫302和200然后200屁股的JS看到200 :( – Slee 2009-08-12 19:36:10

+0

可以看到完整的网址ajax调用? – 2009-08-12 20:17:42

+0

请在这里填写JS代码。谢谢 – 2009-08-13 11:53:24

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'); 
}); 
0

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

但是,您为什么需要看302?当然,如果你得到一个重定向到login.php,然后简单地得到返回的响应的URL(或解析内容)告诉你他们已经注销了?

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

祝你好运。

7

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

全局。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; 
      } 
     } 
     }); 
    }); 
相关问题