2011-10-11 37 views
2

在我的應用程序(ASP.NET MVC 3 RAZOR)中,當會話過期並且用戶嘗試訪問某些內容時,它會將它們重定向到登錄頁面以重新登錄。如果會話已過期,處理AJAX請求

這很好,但是當從ajax請求調用(例如,如果用戶已經離開他們的屏幕一段時間沒有活動),它會在ajax請求中加載登錄表單...這不是我想要的即將發生。

處理這個問題的最好方法是什麼?理想情況下,如果會話已過期,我想顯示一個模式,以便用戶無法訪問其他區域。所以,即使他們離開了屏幕,一些jQuery會檢查會話,然後應用一個模式說「Session Expired」

我該怎麼做?

例如

if(SESSION HAS EXPIRED) { showModal(); } 

回答

2

我可以在這裏看到兩個單獨的可解決的問題,所以我將分別討論它們。

登錄返回AJAX結果
而不是僅僅返回登錄界面,返回消息表明會話已過期。如果您的AJAX收到這樣的消息,它知道用戶需要重新登錄。在這一點上,你可以這樣做

window.location = loginpageurlhere; 

或者,你可以檢查你的Ajax響應,看它是否是預期的響應或者如果它是登錄頁面。如果是登錄頁面,請使用上述建議。

顯示對話框,如果用戶處於非活動狀態的時間太長
對於這一點,你需要知道用戶是多長時間不活動。你可以通過幾種不同的方式來做到這一點,其中之一如下:

  • 當頁面加載時,初始化一個變量用作倒計時。
  • 設置一個計時器,每當計時器用完時就遞減計數器,然後重新啓動。
  • 如果計數器達到零,顯示對話框並讓用戶重新登錄。
  • 每當有效活動發生時(AJAX帖子或其他任何您可能擁有的),請重置計數器。

你可以使用兩種,這些方法,但如果您擔心在無人值守的機器保護數據,第二種方法是最好的,因爲你能擋住屏幕,只顯示該對話框,它會在用戶離開時發生,而第一種方法在用戶實際嘗試在您的頁面上執行操作之前不能執行任何操作。

+0

謝謝;)我要去做倒計時。 – Cameron

+0

我喜歡處理這個(每Darin)的statusCode參數,但這只是一個偏好問題。檢查成功返回的某種「不再認證」標誌或字符串的數據也會起作用。我不會依靠倒計時;這只是一個假的會話,很容易被欺騙。您還需要處理真實的服務器會話。倒計時對於「你已經空閒」的對話可能沒問題。 –

+0

@Greg同意。會話需要跟蹤服務器端。看來OP已經這樣做了,但是另外只是想在會話過期時通知用戶,所以欺騙不應該是問題,因爲服務器不知道用戶是否認爲它仍然被認證。 – yoozer8

2

你可以看看這說明一個很好的技術,讓你在這種情況下,這可能在客戶端被捕獲,並採取相應的行動,服務器返回401狀態碼following blog post(顯示模式來用戶)。

+0

雖然這很好,但我更希望檢測會話是否已過期,然後在全球範圍內做某些事情,以便說用戶已經離開了他們的屏幕,JS可以將重定向發送到另一個頁面或顯示模式。 – Cameron

+0

@Cameron,什麼阻止你這樣做?您可以爲您的整個應用程序提供一個全局完整的AJAX處理程序,因此服務器通過您的任何AJAX調用返回的任何401狀態代碼將集中在一個可處理它們的函數中。在這個功能中,如果你檢測到401狀態碼,你可以做任何你想要的:重定向,顯示模式,... –

+0

同意;並擁有statusCode處理程序意味着您可以預測並處理其他服務器狀態。例如,您的應用程序可能具有用戶角色 - 對用戶沒有足夠權限的請求發出403。 –

0

您可以在jQuery中設置一個全局錯誤處理程序,每次jQuery ajax捕獲錯誤時都會調用它。如果會話超時,則會引發401錯誤。這可以被捕獲並且用戶重定向到登錄頁面。

$(document).ajaxError(function(event, jqxhr, settings, thrownError) { 
    if (jqxhr.status == 401) { 
     window.location.replace("/login"); 
    } 
}); 

應始終將全局錯誤處理程序添加到文檔對象中。