日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

java限制在同一台电脑上只允许有一个用户登录系统

發布時間:2023/12/10 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java限制在同一台电脑上只允许有一个用户登录系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在web應用系統中,出于安全性考慮,經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。

具體一點就是:

1、在同一臺電腦上一次只允許有一個用戶登錄系統;

2、一個用戶在同一時間只允許在一個客戶端登錄。

我最近做的一個系統就遇到了這樣的問題,本來系統已經開發完成了,但是安全測評沒有通過,就是因為沒有做這兩個限制。怎么來做這樣的限制呢?我在網上找了很久,發現問這個問題的人很多,但是沒有找到特別清楚的答案。后來自己摸索著,看了一些書,終于找到解決辦法了。

要解決這個問題實際上不難,對于高手來說可能都懶得去說了,但是對于不熟悉web編程的人來說可能會困擾很久。下面我把我的解決辦法說出來,供大家參考!

先介紹一下我那個系統的背景: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.<listener> 04. 05. <listener-class>監聽器類的路徑,如:com.web.MyListener</ listener-class > 06. 07.</listener>


用戶登錄地址數據傳輸對象:

01.public class UserSessionAdd { 02. 03. 04.private Stringadd; 05. 06. 07.private Stringsessid; 08. 09. 10.private String username 11. 12.public String getUsername(){ 13. 14.return username 15. 16.} 17. 18.Public void setUsername(String username){ 19. 20. this.username=username; 21. 22. } 23. 24.public String getIp() { 25. 26.returnadd; 27. 28.} 29. 30.publicvoid setAdd(String add) { 31. 32.this.add = add; 33. 34.} 35. 36.public String getSessid() { 37. 38.returnsessid; 39. 40.} 41. 42.publicvoid setSessid(String sessid) { 43. 44.this.sessid = sessid; 45. 46.} 47. 48. 49.}

用戶登錄的代碼:

03.String userHost = request.getRemoteHost(); 04. 05.String sessionId = request.getSession().getId(); 06. 07.UserSessionAdd usa = new UserSessionAdd(); 08. 09.usa.setUsername(username); 10. 11.usa.setSessid(sessionId); 12. 13.usa.setAdd(userHost); 14. 15.request.getSession().setAttribute(“usa”,usa);


監聽器代碼:

01.publicclass MyListenerimplementsHttpSessionAttributeListener{ 02. 03. 04.Map<String, HttpSession> map =new HashMap<String, HttpSession>(); 05. 06.publicvoidattributeAdded(HttpSessionBindingEvent event) { 07. 08.String name = event.getName(); 09. 10.if(name.equals("usa")){ 11. 12.UserSessionAdd usa = (UserSessionAdd)event.getValue(); 13. 14.if(map.get(usa.getAdd())!=null){ 15. 16.HttpSession sess = map.get(usa.getAdd()); 17. 18.UserSessionAdd usa1 = (UserSessionAdd)sess.getAttribute("usa"); 19. 20.sess.removeAttribute("usa"); 21. 22.sess.invalidate(); 23. 24.} 25. 26.map.put(usa.getAdd(), event.getSession()); 27. 28.} 29. 30.} 31. 32. 33.publicvoidattributeRemoved(HttpSessionBindingEvent event) { 34. 35.String name = event.getName(); 36. 37.if(name.equals("usa")){ 38. 39.UserSessionAdd usa = (UserSessionAdd)event.getValue(); 40. 41.map.remove(usa.getAdd()); 42. 43.} 44. 45.} 46. 47. 48.publicvoidattributeReplaced(HttpSessionBindingEvent event) { 49. 50.// TODO Auto-generated method stub 51. 52.```` 53. 54.} 55. 56.}


轉自:http://blog.csdn.net/yutan_313/article/details/5405934


創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java限制在同一台电脑上只允许有一个用户登录系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。