2012-01-27 29 views
5

我有一個應用程序使用devise進行安全保護,會話超時時間爲30分鐘。如果用戶點擊一個鏈接超時,他們會被重定向回登錄屏幕,並顯示「您的會話已過期,請再次登錄以繼續。」,非常好。RoR中使用設計的會話超時消息

但是我在很多地方都有ajax。如果會話超時並且用戶執行ajax操作,我需要與上面相同的行爲,而不是在後臺發生401錯誤而無法執行。

到目前爲止,我有每一頁上這個jQuery代碼來捕獲401S和重裝:

$(document).ajaxError(function(e, error) { 
    switch(error.status) { 

    case 401: { 
     // unauthorised (possible timeout) 
     location.reload(); 
     break; 
    } 

它工作得很好,但有一個惱人的問題:

由於Ajax請求命中設計第一,當我的應用程序重新載入頁面時,我將其引導到登錄頁面,但是我沒有看到超時消息,我看到未經身份驗證的「您需要先登錄或註冊才能繼續。」信息。

有沒有辦法確保在第二個請求設計仍然顯示超時消息?

回答

2

我認爲你需要手動顯示這個消息,例如通過重定向到一個特定的URL或設置一些查詢參數。

問題是,在您的401請求獲得新會話後,當您重新加載瀏覽器時,下一個請求將以空會話命中您的應用程序。這就是爲什麼你得到未經認證的信息。

1

超時消息「您的會話已過期,請重新登錄才能繼續。」在xhr.responseText可用,這樣一種方法是隻顯示:

$(document).ajaxError(function(e, error) { 
    switch(error.status) { 

    case 401: { 
     // unauthorised (possible timeout) 
     location.reload(); 
     alert(xhr.responseText); 
     break; 
    } 

對我來說這似乎是更好的流動性:點擊在Ajax表單上更新,獲取會話超時的提醒,然後在登錄頁面的閃存中查看「您需要先登錄或註冊才能繼續」。