隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          類似QQ的同名用戶登錄問題的解決

          發(fā)現(xiàn)對于登錄問題的解決都說用session監(jiān)聽,但是沒有人寫出示例代碼,今天寫了一個(gè),希望對大家有所幫助.
          解決同名用戶登錄的問題,類似QQ,即同名用戶第二次登錄,第一次登錄的用戶就掉線.
          SessionListener.java監(jiān)聽session的類,部署于/App/WEB-INF/classes/com/test下(其中App為你的應(yīng)用程序目錄)
          package com.test;
          import javax.servlet.http.*;
          import java.util.*;

          public class SessionListener implements HttpSessionListener{
              private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
              /**以下是實(shí)現(xiàn)HttpSessionListener中的方法**/
              public void sessionCreated(HttpSessionEvent se){
              }
             
              public void sessionDestroyed(HttpSessionEvent se){
                  hUserName.remove( se.getSession().getId() );
              }
              /*
               * isAlreadyEnter-用于判斷用戶是否已經(jīng)登錄以及相應(yīng)的處理方法
               * @param sUserName String-登錄的用戶名稱
               * @return boolean-該用戶是否已經(jīng)登錄過的標(biāo)志
               */
              public static boolean isAlreadyEnter(HttpSession session,String sUserName){
                  boolean flag = false;
                  if(hUserName.containsValue(sUserName)){//如果該用戶已經(jīng)登錄過,則使上次登錄的用戶掉線(依據(jù)使用戶名是否在hUserName中)
                      flag = true;
                      //遍歷原來的hUserName,刪除原用戶名對應(yīng)的sessionID(即刪除原來的sessionID和username)
                      Iterator iter = hUserName.entrySet().iterator();
                      while (iter.hasNext()) {
                          Map.Entry entry = (Map.Entry)iter.next();
                          Object key = entry.getKey();
                          Object val = entry.getValue();
                          if( ( (String)val ).equals(sUserName) ){
                              hUserName.remove(key);
                          }
                      }
                      hUserName.put( session.getId(),sUserName );//添加現(xiàn)在的sessionID和username
                      System.out.println("hUserName = " + hUserName);
                  }
                  else{//如果該用戶沒登錄過,直接添加現(xiàn)在的sessionID和username
                      flag = false;
                      hUserName.put( session.getId(),sUserName );
                      System.out.println("hUserName = " + hUserName);
                  }
                  return flag;
              }
              /*
               * isOnline-用于判斷用戶是否在線
               * @param session HttpSession-登錄的用戶名稱
               * @return boolean-該用戶是否在線的標(biāo)志
               */
              public static boolean isOnline(HttpSession session){
                  boolean flag = true;
                  if( hUserName.containsKey( session.getId() ) ){
                      flag = true;
                  }
                  else{
                      flag = false;
                  }
                  return flag;
              }
          }

          web.xml部署于/App/WEB-INF下
          <?xml version="1.0" encoding="ISO-8859-1"?>

          <!DOCTYPE web-app
          PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "
          http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

          <web-app>

          <listener>
          <listener-class>
          com.inspirer.dbmp.SessionListener
          </listener-class>
          </listener>

          </web-app>
          應(yīng)用部分
          1.在你的登錄驗(yàn)證時(shí),調(diào)用SessionListener.isAlreadyEnter(session,"admin")
          既可以判斷該用戶名的用戶是否登錄過,又可以使上次登錄的用戶掉線
          2.其他頁面調(diào)用SessionListener.isOnline(session),可以判斷該用戶是否在線.

          posted on 2005-03-05 14:57 閱讀(295) 評論(0)  編輯  收藏 所屬分類: J2ee

          主站蜘蛛池模板: 洛川县| 平定县| 聂拉木县| 鄂温| 桃江县| 仪征市| 吉木萨尔县| 禄劝| 华阴市| 石城县| 大同市| 渝中区| 祁东县| 开江县| 宜城市| 都匀市| 调兵山市| 固安县| 杭州市| 汉川市| 灌云县| 临高县| 黎平县| 建始县| 蕉岭县| 巴林左旗| 和顺县| 承德县| 张掖市| 宝鸡市| 祁东县| 永登县| 资兴市| 永康市| 宽城| 丰台区| 赤壁市| 石柱| 广水市| 河东区| 惠安县|