簡體   English   中英

如何維護用戶登錄會話?

[英]How to maintain user login session?

我正在嘗試在我的Android應用程序中維護用戶登錄會話(1小時)。 當用戶登錄時,我從服務器接收登錄時間(StartTime)和會話結束時間(Timemout)。

我正在使用System api(System.currentTimeMillis())將收到的登錄時間+會話結束時間與當前設備時間進行比較。

我的問題是用戶可以通過更改位置或更改設備中的時鍾時間來操作System.currentTimeMillis(),並且可以具有無限次登錄會話。

我還嘗試使用SystemClock.elapsedRealtime(),它取決於啟動時間。 用戶可以通過重新啟動設備來重置或控制時間的位置。

無論如何,要維持1小時的登錄時間?

從服務器接收的StartTime和Timeout時間。

((開始時間+超時)>(System.currentTimeMillis()/ 1000))

要么

((開始時間+超時)>(SystemClock.elapsedRealtime()/ 1000))

此處的目標是確保會話不會超過特定的時間長度,而不管設備本地時間的日期/時間如何變化。 這里的一個常數是服務器的時間,因此讓我們利用它。

  1. 在應用啟動時,使您的應用查詢服務器以查看其是否具有活動會話。 如果不是,請向用戶顯示登錄屏幕。
  2. 如果存在活動會話,則服務器應返回該會話的剩余持續時間。 這意味着您的服務器將跟蹤哪些設備已登錄以及何時登錄。 這樣,當收到身份驗證請求時,它將檢查其列表中是否有最近一次登錄成功的信息,並返回當前時間與上次登錄時間之間的差額。 如果最近一小時沒有成功登錄,則請求失敗
  3. 在應用程序端,當身份驗證請求成功時,我們將啟動一個計時器,等待服務器返回的時間長度。 您可以自己實現,也可以只使用ScheduledThreadPoolExecutor。 無論如何,您的計時器不能在其實現中使用System.currentTimeMillis(),否則它將受到本地時間更改的影響。 有關更多信息,請參閱答案。
  4. 計時器結束后,您可以將用戶鎖定並強制他們再次登錄,或者干脆讓他們停留在該應用程序關閉之前。 這取決於您和用戶體驗和安全性的優先事項。

簡而言之,該應用始終處於兩種狀態之一。 它要么未經身份驗證並等待用戶登錄,要么經過身份驗證並在計時器上確定何時將其再次鎖定用戶。 這樣,您就不必如此頻繁地ping服務器來檢查會話狀態

如前面的鏈接中所述,System.nanoTime()是在計時器中使用的好工具,該計時器不受本地時間更改的影響。 Java文檔中的更多詳細信息

這可以在服務器端處理。 您可以在服務器上為該用戶創建一個會話,該會話將在1小時后超時(在要求中指定)。

在這種情況下,您可以通過以下任何一種方式通知用戶有關會話注銷的信息:

  1. 如果會話超時后出現任何請求,則它將在會話注銷時通知用戶。

  2. 會話過期時,服務器可以在會話注銷后向客戶端發送通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM