做一個網站系統,用戶每一次請求都要檢查登錄信息,而這些信息一般是保存在session或者cookie中,所以一般會判斷session或者cookie中是否有數據來確定是否登錄了。
遇到一種情況,就是在后臺管理用戶的時候,例如把某一個用戶刪除了,但是該用戶只要還保留session數據的話還是能操作的。
針對這種情況,我想到兩種辦法:
1:每一次檢查用戶是否登錄的時候要實時的查詢表數據,不單單是檢查session。
2:用數據庫來保存用戶的cookieId,當用戶狀態改變時候,修改對應的session數據。
不知道還有沒有其他更好的辦法來解決。歡迎交流,一起學習。
8 回答

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
先來復習一下session的基本原理:
a.生成過程:
用戶在客戶端輸入用戶名密登錄 -> 服務器驗證用戶名密碼正確 -> 服務器隨機生成一個token(一般叫session_id) -> 服務端以session_id為主鍵(或key),綁定session數據(最基本就是uid,有時會加上基本的用戶profile數據) -> 將session_id返回給客戶端(一般是cookie)
b.使用:
客戶端帶session_id訪問(一般是cookie) -> 服務端根椐session_id查詢session,如有,則認證成功,繼續根椐session的內容(如uid)獲取業務數據。
再回到你的問題,其實你的思路基本是對的:
- 用戶訪問時,先查詢session,如果已登錄,再查uid是否存在 ,uid存在才認證成功。
如果擔心性能問題,可把uid直接用本地內存或memcache等緩存起來(刪除用戶時同時清除緩存,緩存丟了就重新登錄)
- 保存session時,建立與uid的映射, 比如:
如果session是存在關系數據庫,那就 sid,session,將用戶id作為session的值,那樣,刪除用戶時就可以刪除該用戶的session
如果session存在文件或者redis之類, 可以在生成session時同時建立反向映射關系保存,目的也是當后臺刪除用戶時可以找到對應用戶的session來刪除

嗶嗶one
TA貢獻1854條經驗 獲得超8個贊
如果每次請求,頻繁查詢數據庫并不理想。
常用過一個小技巧就是,寫個定時ajax請求,如每隔5分鐘檢查一次。這種方法簡單。
還有一種方法就是使用socket實現,如單點登陸原理一樣實現

繁花不似錦
TA貢獻1851條經驗 獲得超4個贊
簡單說一下我們的設計思路吧。我這邊是每次請求,都會重新生成一個新的sessionId,返回給前端,前端將sessionId設置到header,每次請求將sessionId攜帶傳遞給服務端,服務端將獲取sessionId進行對比,前端一般sessionId存儲到localstorage或cookie中,服務端將sessionId一般存儲到數據庫或者緩存

紅糖糍粑
TA貢獻1815條經驗 獲得超6個贊
自己想到一個方法,不知道可行不。歡迎交流。
就是保存的session文件名都是有sessionID的,那么只要保存好sessionID,直接使用unlink去刪除那個文件,可否?
- 8 回答
- 0 關注
- 884 瀏覽
添加回答
舉報
0/150
提交
取消