有您提出的解決方案的一些問題使其無法使用:
會話和身份驗證都使用客戶端cookie來管理其狀態。服務器只能使認證/會話失效。它不能直接「註銷」用戶,因爲該部分不受直接的服務器控制。換句話說,你可以設置一些說某個用戶應該註銷的東西,但該用戶實際上不會被註銷,直到他們嘗試發出另一個請求,並且由服務器執行一些檢查,然後影響該請求當時用戶的狀態改變。
會話採用滑動超時。這意味着任何請求客戶端使得會重置他們的會話超時。換句話說,如果您每隔30秒長時間輪詢一次會話狀態,用戶將實際上擁有永不過期的永久會話。
會話有意匿名。出於安全原因,客戶端與會話的唯一鏈接是具有其會話ID的cookie。通過將Cookie設置爲成功攻擊中的必備組件,可以防止某種程度的會話劫持。有了像Secure
令牌之類的東西,那麼當然在您的站點上使用SSL,則可以有效地防止該cookie在分配給它的客戶端之外的其他任何環境中都可用。總而言之,除了與用戶直接聯繫以外,沒有任何方法可以確定哪個會話屬於給定用戶。
緩存本質上是不穩定的。你可以說特定的鑰匙應該有一段時間的生命,但這只是一個建議。有許多不同的因素可能導致緩存項目被破壞,而這些因素大部分完全不受控制。
鑑於所有這一切,你必須從不同的方向來解決這個問題。我的建議是在一個單獨的表格中跟蹤登錄/會話,這是一般意義上的。它基本上是一種日誌。當用戶登錄或創建新會話時,您需要向該數據庫添加記錄。如果用戶的身份驗證或會話過期,則會更新相應的記錄。如果用戶故意註銷,您可以刪除該記錄或將其標記爲非活動狀態。就您的管理員而言,他們會管理此表,將記錄移除或標記爲非活動狀態。
然後,您將不得不圍繞您的網站操作添加一些邏輯來解釋此表。您可以創建一個操作篩選器來檢查此表並執行任何必要的操作。例如,如果用戶已被管理員「註銷」,操作篩選器將從該表中讀取相應的記錄,查看該用戶已被註銷,然後通過實際簽出用戶來影響該更改。
由於長輪詢會導致會話永不過期,您基本上需要管理自己的超時。例如,您可以在「日誌」表中記錄創建會話的時間,然後將該時間與每個後續請求(包括AJAX)上的當前時間進行比較。同樣,你可以爲此使用一個動作過濾器。如果會話根據您的超時「過期」,那麼您可以手動銷燬用戶的會話。
有很多其他的東西需要用這種方式添加或解釋,但希望能給你一個很好的工作框架。
爲了讓客戶端知道會話是否過期,必須進行ajax調用以檢查活動會話。 –
同樣爲了在用戶關閉瀏覽器時清除會話,也必須涉及輪詢。 –
@RyanSearle你能解釋我什麼是投票,或者至少給我一些鏈接,說明它在哪裏解釋?謝謝 –