在web應用系統中,出於安全性考慮,經常需要對同一客戶端登入的使用者數量和乙個客戶同時在多個客戶端登陸進行限制。
具體一點就是:
1、在同一臺電腦上一次只允許有乙個使用者登入系統;
2、乙個使用者在同一時間只允許在乙個客戶端登入。
我最近做的乙個系統就遇到了這樣的問題,本來系統已經開發完成了,但是安全測評沒有通過,就是因為沒有做這兩個限制。怎麼來做這樣的限制呢?我在網上找了很久,發現問這個問題的人很多,但是沒有找到特別清楚的答案。後來自己摸索著,看了一些書,終於找到解決辦法了。
先介紹一下我那個系統的背景:j2ee,tomcat,沒有用cookie。
首先確定解決這兩個問題的基本思路:
1、要解決同一臺電腦上只允許有乙個使用者登入系統,只有乙個辦法。監視每乙個連線的**,如果發現有乙個新的連線與某個已經存在的連線來自同一臺電腦,則終止其中的乙個(當然,也可以提醒使用者,讓他自己決定終止哪乙個)。
2、要禁止乙個使用者賬號同時在不同的客戶端登入,只有監視每乙個連線的使用者賬號,如果發現乙個新連線的使用者賬號跟某個已經存在的連線的使用者賬號相同,則自動將前乙個終止(同樣,也可以讓使用者自己決定終止哪乙個)。
確定了基本思路以後,就要找具體辦法了。我最初的想法是在資料庫建立一張表,存放已登入使用者的使用者名稱、實體地址、session id等資訊。當使用者登入時,與這張表裡面的資料進行匹配,如果發現實體地址與表中的某條記錄相同,則表示是同一臺客戶端上有多個使用者再登入,如果發現正在登入的使用者的使用者名稱與表中已有記錄相同而主機名不同,則表示是乙個賬號同時在不同的客戶端使用。
相信很多一開始遇到這個問題的人都會考慮這種解決辦法。但是這種辦法有很多問題,最主要的問題有兩個:第一是效率,每一次都要從資料庫裡面取資料進行匹配。第二是使用者退出時需要刪除表中的記錄,而當使用者非正常退出時,很難及時監測(後來發現其實有辦法監測)。
後來在網上的某個帖子裡面看到一位大俠提到用***,只是那位大俠說的太含糊,照他說的辦法根本無法解決。雖然無法解決,但是提供了乙個思路。於是我找了一本書,仔細看了其中關於***的部分。解決辦法就在其中了!!!
***可以監聽session及其所包含的屬性,即attribute。
所以我們要做的就是:
1、建立乙個***,實現httpsessionattributelistener
介面,監聽每乙個attribute的增加、編輯、刪除事件。***中還要建立乙個map,將所有的session放入這個map中。
2、在使用者登入時將使用者名稱、實體地址、session id存到session中去(可以建立乙個使用者登入位址資料傳輸物件,我建立了乙個usersessionadd類,裡面包含username,macadd,sessionid三個屬性,使用者登入時將這個資料物件初始化,並存入到session中)。
3、每個新會話開啟時,在***中對session包含的屬性進行判斷,如果新增的屬性與map中已有session的使用者登入位址資料相同,則表示新會話與我們要做的兩個限制相衝突。將與之衝突的會話提取出來,銷毀掉!
這麼說,還是不夠清楚,下面看**:
web.xml檔案:
03.04.
05. ***類的路徑,如:com.web.mylistener
06.
07.
01.public class usersessionadd
17.
18.public void setusername(string username)
23.
24.public string getip()
29.
30.publicvoid setadd(string add)
35.
36.public string getsessid()
41.
42.publicvoid setsessid(string sessid)
47.
48.
49.}
使用者登入的**:
java限制在同一臺電腦上只允許有乙個使用者登入系統
在web應用系統中,出於安全性考慮,經常需要對同一客戶端登入的使用者數量和乙個客戶同時在多個客戶端登陸進行限制。具體一點就是 1 在同一臺電腦上一次只允許有乙個使用者登入系統 2 乙個使用者在同一時間只允許在乙個客戶端登入。我最近做的乙個系統就遇到了這樣的問題,本來系統已經開發完成了,但是安全測評沒...
同一臺電腦上使用gitlab和github
在公司實習,使用的是公司郵箱賬號登入gitlab,而使用自己的私人郵箱賬號登入github,因此需要生成兩個ssh的key對應不同的伺服器。使用命令 ssh keygen t rsa c youremailaddress 生成key,其預設在 ssh 目錄下生成id rsa和id rsa.pub兩個...
同一臺電腦 多ssh配置
ps 此文基於你已經能夠正常的生成sshkey 對於sshkey的功能這裡就不多做介紹了,本文介紹的是乙個更高階的功能 同一臺電腦配置多個sshkey,方便本機在和不同的伺服器 不同的專案之間 通訊的時候自動切換賬號 以下兩種任選一種即可 1.生成新的ssh key並命名為 custom rsa s...