我有一個要求,我希望用戶只能在一臺機器上使用他的ID登錄。我想在db中使用一個標誌,例如isLoggedIn = true或false。所以下次用戶從其他機器登錄時,我會去檢查他在DB中的憑據,如果會話已經打開,我也可以檢查標誌。會話跟蹤
這種方法的缺點是在註銷時我必須每次都去數據庫並將該標誌設置爲false。有沒有更好的方法,我不必去服務器端,只能在客戶端驗證它,如果它不同的機器,但同一用戶ID?
由於提前
我有一個要求,我希望用戶只能在一臺機器上使用他的ID登錄。我想在db中使用一個標誌,例如isLoggedIn = true或false。所以下次用戶從其他機器登錄時,我會去檢查他在DB中的憑據,如果會話已經打開,我也可以檢查標誌。會話跟蹤
這種方法的缺點是在註銷時我必須每次都去數據庫並將該標誌設置爲false。有沒有更好的方法,我不必去服務器端,只能在客戶端驗證它,如果它不同的機器,但同一用戶ID?
由於提前
執行這個嚴格規則的唯一明智的方法是在服務器端。考慮一下:建立一個客戶瞭解其他客戶存在的架構並不完全安全;讓客戶瞭解其他客戶的當前登錄狀態或活動更加糟糕。應該瞭解所有客戶端的唯一方是服務器。
爲數據庫中的每個用戶設置「已登錄」標誌是有問題的,因爲忘記註銷的用戶將永遠無法再次登錄。
然而,這種嚴厲要求兩個潛在的解決方案:
商店lastActiveTime
,IP
並且在用戶登錄客戶端的port
。在您的客戶端代碼中,定期向服務器發出「保持會話正常」呼叫以更新lastActiveTime
。如果另一個客戶端嘗試使用具有不同IP和端口的相同用戶帳戶登錄或執行操作,請拒絕該操作,直至lastActiveTime
超過閾值時間(例如10分鐘後)。註銷時或第一次客戶端超時後,請清除客戶端的lastActiveTime
,IP
和port
以便允許進程重新啓動。
存儲客戶端的IP和端口。當另一個客戶端出現問題時,而不是讓他等待另一個客戶端超時,發出第一個客戶端 - 停止並清除用戶會話,與第二個客戶端開始新的會話。
你的方案有一個重要的問題 - 如果客戶端「忘記」更新DB(設置你的布爾變量設置爲false) - 你無法登錄下一次 - 例如,它可以在發生的情況下的客戶端有電源故障和硬重啓/關機。
更好的方法(但不完美) - 您可以保存您的客戶端的IP地址。