作者:風(fēng)柏楊
來(lái)源:CSDN
原文:https://blog.csdn.net/one_and_only4711/article/details/72577345
不少系統(tǒng)都希望實(shí)現(xiàn)同一個(gè)賬戶同一時(shí)間只能在一個(gè)地方登錄绸狐,如騰訊QQ,當(dāng)你的賬戶在另一個(gè)終端登錄后号杏,之前正在登錄訪問(wèn)的終端會(huì)被強(qiáng)制下線续室,這樣做的好處我認(rèn)為有兩點(diǎn):1)能提高系統(tǒng)/網(wǎng)站的安全性饲帅,比如說(shuō)如果你在操作過(guò)程中被擠下線了闻妓,你便能馬上察覺(jué)到賬戶和密碼已經(jīng)泄露岁钓,要馬上修改密碼或聯(lián)系管理員凍結(jié)賬戶狸捅;2)能減少系統(tǒng)的開(kāi)銷激涤,因?yàn)槊總€(gè)登錄的終端都需要耗費(fèi)服務(wù)器資源拟糕,登錄的用戶,Session占用的空間也會(huì)大些倦踢,如果賬戶做了只能在一個(gè)終端登錄后已卸,其他終端的登錄會(huì)話所占用的資源能及時(shí)得到釋放,有利于節(jié)省寶貴的服務(wù)器資源硼一,此外累澡,如果不做這個(gè)限制,有可能會(huì)被惡意攻擊的人利用這個(gè)問(wèn)題來(lái)消耗服務(wù)器資源般贼,這樣可能對(duì)服務(wù)器的性能產(chǎn)生很大的影響愧哟。
那怎樣才能實(shí)現(xiàn)單終端登錄限制呢?下面來(lái)介紹一下我的實(shí)現(xiàn)思路哼蛆,希望能幫助到有同樣需求的小伙伴蕊梧,有異議的朋友也歡迎留言交流。
先來(lái)看一個(gè)流程圖:
在賬戶表的基礎(chǔ)上腮介,我新建了一個(gè)賬戶account_session表肥矢,用來(lái)記錄登錄賬戶的account_id和最新一次登錄成功用戶的session_id,然后首先要修改登錄方法:每次登錄成功后叠洗,要將登錄用戶信息寫入Session的同時(shí)還要更新account_session表里相應(yīng)賬戶的session_id(當(dāng)然甘改,如果是第一次登錄時(shí),進(jìn)行的便是插入動(dòng)作)灭抑,然后要修改獲取當(dāng)前用戶信息的方法十艾,在里面要做兩重判斷,首先腾节,看當(dāng)前會(huì)話是否存在登錄用戶信息忘嫉,如果沒(méi)有荤牍,則肯定是未登錄,不再贅述庆冕,如果有康吵,還要再進(jìn)一步要用當(dāng)前會(huì)員里存的account_id去account_session表查詢最新的session_id,與當(dāng)前會(huì)員中的session_id作比較访递,如果是一致的晦嵌,說(shuō)明當(dāng)前會(huì)話是最新的會(huì)話,登錄狀態(tài)正常力九,如果不一致,說(shuō)明在當(dāng)前登錄會(huì)話創(chuàng)建后邑闺,被新的登錄會(huì)話覆蓋掉了跌前,當(dāng)前的登錄會(huì)話已經(jīng)失效,這時(shí)候陡舅,服務(wù)器應(yīng)該刪除當(dāng)前的登錄會(huì)話并返回提示給客戶端抵乓,至此,限制賬戶同一時(shí)間單終端登錄功能便實(shí)現(xiàn)了靶衍。