多终端登录,只保留一个移动端+PC端同时在线
大家好,我是入錯行的bug貓。(http://blog.csdn.net/qq_41399429,謝絕轉載)
今天突然有小伙伴在群里問bug貓,多終端登錄怎么搞。
bug貓說,不知道百度的程序猿不是好碼農!
后來bug貓自己百度一下發現,還真沒有!
于是就有這篇博文了~
今天就不羅嗦,畢竟快要下班放假了
多終端登錄,只保留一個移動端+PC端同時在線。類似于微信、QQ,一個賬號只能是一臺電腦、或者一部手機同時在線,但是電腦和手機卻可以同時在線。
既然有移動端,那么后臺服務系統,存放用戶信息的,肯定是用緩存。使用token、或者sessionId東西,在緩存中取用戶信息。
為了統一,假設就叫token吧!
設計思路:
- 用戶在登錄的時候,需要傳入登錄端類型:移動端;PC端;
- 用戶信息,在緩存中分為兩個部分存儲:
- 根據token,獲取到用戶id,稱為 緩存A ----> token:userId
- 根據用戶id,獲取到用戶信息,稱為 緩存B ----> userId:userInfo
- 用戶信息對象userInfo,里面必須要有一個Map,map鍵為終端類型,值為終端類型對應的token。終端類型:token值
登錄流程:
假設用戶在登錄,已經通過賬號密碼的驗證,并且從數據中取到User對象
生成一個新token
根據用戶id,在緩存B中,取用戶信息:userInfo = getByUserId(userId)
? ?沒有緩存:可喜可賀,用戶第一次登錄、或者用戶又回來了。將User對象,轉換成userInfo
? ?有緩存:有就有唄,可以肯定userInfo現在有值了…
判斷userInfo對象中的Map,能否根據終端類型,獲取到值:
? ?有值:說明用戶這個終端,之前登錄過,舊token還有效;
? ? ? ? a. 根據舊token,刪除緩存A中的數據:delByToken(token)
? ? ? ? b. 將新token存入到Map中
? ? ? ? c. 在緩存A中存入數據
? ? ? ? d. 重新將userInfo存入緩存B中
? ?無值:說明用戶這個終端,沒有登錄、或者token失效:
? ? ? ? a. 將新token存入到Map中
? ? ? ? b. 在緩存A中存入數據
? ? ? ? c. 重新將userInfo存入緩存B中
再將新token賦值給userInfo,返回給前端。注意Map不要序列化也返回了!
退出登錄:
? ?為0,根據用戶id,刪除緩存B中的數據
? ?不為0,什么也不做
大概流程就是這樣。
其他細節,略 (?ω?)
里面還涉及到,移動端token失效時長、移動端有token免登陸等,各自根據具體業務實現就好~
本次博文寫得真愉快,以后也像這樣偷懶吧 (?ω?)噗
總結
以上是生活随笔為你收集整理的多终端登录,只保留一个移动端+PC端同时在线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RT-Thread柿饼控件(1)--
- 下一篇: STL学习(转)