2009-08-12 182 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; 
      } 
     } 
     }); 
    }); 
相關問題