<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 100  文章 - 50  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    在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文件:

    <listener>

           <listener-class>監聽器類的路徑,如:com.web.MyListener</ listener-class >

    </listener>

     

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

    public class UserSessionAdd {

       

        private String add;

       

        private String sessid;

       

        private String username

     

        public String getUsername(){

           return username

        }

        Public void setUsername(String username){

           this.username=username;

        }

        public String getIp() {

           return add;

        }

        public void setAdd(String add) {

           this.add = add;

        }

        public String getSessid() {

           return sessid;

        }

        public void setSessid(String sessid) {

           this.sessid = sessid;

        }

       

    }

     

    用戶登錄的代碼:

    ···

    String userHost = request.getRemoteHost();

    String sessionId = request.getSession().getId();

    UserSessionAdd usa = new UserSessionAdd();

    usa.setUsername(username);

    usa.setSessid(sessionId);

    usa.setAdd(userHost);

    request.getSession().setAttribute(“usa”,usa);

     

     

    監聽器代碼:

    public class MyListener implements HttpSessionAttributeListener{

       

        Map<String, HttpSession> map = new HashMap<String, HttpSession>();

        public void attributeAdded(HttpSessionBindingEvent event) {

           String name = event.getName();

           if(name.equals("usa")){

               UserSessionAdd usa = (UserSessionAdd)event.getValue();

               if(map.get(usa.getAdd())!=null){

                  HttpSession sess = map.get(usa.getAdd());

                  UserSessionAdd usa1 = (UserSessionAdd)sess.getAttribute("usa");

                  sess.removeAttribute("usa");

                  sess.invalidate();

               }

               map.put(usa.getAdd(), event.getSession());

           }

        }

     

        public void attributeRemoved(HttpSessionBindingEvent event) {

           String name = event.getName();

           if(name.equals("usa")){

               UserSessionAdd usa = (UserSessionAdd)event.getValue();

               map.remove(usa.getAdd());

           }

        }

     

        public void attributeReplaced(HttpSessionBindingEvent event) {

           // TODO Auto-generated method stub

           ````

        }

    }

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yutan_313/archive/2010/03/22/5405934.aspx

    posted on 2010-06-10 10:27 fly 閱讀(1633) 評論(0)  編輯  收藏 所屬分類: jsp學習
    主站蜘蛛池模板: 亚洲av午夜精品一区二区三区| 免费国产污网站在线观看15| 成人毛片免费在线观看| 亚洲va中文字幕| 大学生高清一级毛片免费| 亚洲乱码在线卡一卡二卡新区| 中文字幕av无码无卡免费| 亚洲欧洲日产国码一级毛片| 偷自拍亚洲视频在线观看99| 免费国产成人午夜私人影视| 九九视频高清视频免费观看| 成年人性生活免费视频| 亚洲人配人种jizz| 成人电影在线免费观看| 免费jlzzjlzz在线播放视频| 一级毛片在线完整免费观看| 国产精品久久久亚洲| 国产成人高清亚洲一区久久| 亚洲国产成人精品女人久久久 | 亚洲第一成年男人的天堂| 亚洲成aⅴ人片久青草影院按摩| 日韩成人免费在线| 亚洲国产成人精品无码一区二区| 亚洲精品免费网站| 偷自拍亚洲视频在线观看99| 亚洲日韩精品无码专区网址| 57pao国产成永久免费视频| 亚洲国产精品白丝在线观看| 无码人妻久久一区二区三区免费| 亚洲第一区视频在线观看| 日本xxxx色视频在线观看免费| 中文字幕亚洲码在线| 亚洲七七久久精品中文国产| 最近免费中文字幕mv在线电影| 国产亚洲中文日本不卡二区| 久久亚洲国产成人影院网站 | 婷婷国产偷v国产偷v亚洲| 成人毛片免费视频| 久久精品无码免费不卡| 久久久久久久综合日本亚洲| 国产曰批免费视频播放免费s|