在線用戶列表的一個實現方案

在線用戶表結構

方案描述

說明

當有用戶上線時,插入表中一條數據。用戶下線時(或者判斷用戶離線時)將該條數據刪除。web

登陸時校驗

若是用戶已經登陸,提示「用戶已經登陸」。分佈式

在線用戶寫入

成功登陸時寫入表中數據。優化

用戶下線時刪除

用戶主動退出系統,從表中刪除用戶userId對應的記錄。加密

用戶離線判斷

針對異常下線的狀況,使用邏輯進行判斷:若是用戶半個小時內都沒有操做,則判斷用戶已下線,將用戶從在線用戶表中刪除。spa

技術上難點的實現

一些信息如何存儲?好比用戶登錄時間(USER_LOGIN_TIME)、用戶登陸類型(LOGIN_APP_TYPE)、登陸設備(LOGIN_DEVICE)等信息

使用token。用戶登陸成功時,使用token存儲用戶登錄時間(USER_LOGIN_TIME)、用戶登陸類型(LOGIN_APP_TYPE)、登陸設備(LOGIN_DEVICE)、用戶userID(USER_ID)等信息。blog

所謂的token,就是如下面這種格式token

admin&1,2,3&11,12,13&2018-10-10 10:00:00&web&1字符串

將這個字符串進行加密轉碼(可逆加密),最後獲得的就是token。解密時使用String.split(「&」)獲得List,按照以前的約定格式就能夠得到各類信息。it

說白了,就是用戶登陸成功後將用戶登錄時間(USER_LOGIN_TIME)、用戶登陸類型(LOGIN_APP_TYPE)這些信息做爲校驗的token返回給用戶,而後每次再讓用戶發送過來進行校驗及解析數據。ast

在哪裏解析呢?攔截器,本身定義一個攔截器,註冊好,而後用來校驗和解析token,獲取用戶登錄時間(USER_LOGIN_TIME)、用戶登陸類型(LOGIN_APP_TYPE)這些信息。

如何判斷用戶半小時內沒有操做

單例模式構造一個全局Map

Map(Long userId,Date lastOperaTime)。

攔截器更新用戶最後操做時間

註冊一個攔截器,每次請求都要根據用戶userId更新用戶最後操做時間。

定時任務半小時運行一次剔除半小時內沒有操做的在線用戶

說明

項目比較小,也並不是分佈式系統,採用的這種簡單的方案。

如今用於項目中,還在觀察效果。沒有最好的方案,合適就好。會根據出現的問題進行修改和優化。

相關文章
相關標籤/搜索