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

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

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

          public class SessionListener implements HttpSessionListener{
              private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
              /**以下是實現HttpSessionListener中的方法**/
              public void sessionCreated(HttpSessionEvent se){
              }
             
              public void sessionDestroyed(HttpSessionEvent se){
                  hUserName.remove( se.getSession().getId() );
              }
              /*
               * isAlreadyEnter-用于判斷用戶是否已經登錄以及相應的處理方法
               * @param sUserName String-登錄的用戶名稱
               * @return boolean-該用戶是否已經登錄過的標志
               */
              public static boolean isAlreadyEnter(HttpSession session,String sUserName){
                  boolean flag = false;
                  if(hUserName.containsValue(sUserName)){//如果該用戶已經登錄過,則使上次登錄的用戶掉線(依據使用戶名是否在hUserName中)
                      flag = true;
                      //遍歷原來的hUserName,刪除原用戶名對應的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 );//添加現在的sessionID和username
                      System.out.println("hUserName = " + hUserName);
                  }
                  else{//如果該用戶沒登錄過,直接添加現在的sessionID和username
                      flag = false;
                      hUserName.put( session.getId(),sUserName );
                      System.out.println("hUserName = " + hUserName);
                  }
                  return flag;
              }
              /*
               * isOnline-用于判斷用戶是否在線
               * @param session HttpSession-登錄的用戶名稱
               * @return boolean-該用戶是否在線的標志
               */
              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>
          應用部分
          1.在你的登錄驗證時,調用SessionListener.isAlreadyEnter(session,"admin")
          既可以判斷該用戶名的用戶是否登錄過,又可以使上次登錄的用戶掉線
          2.其他頁面調用SessionListener.isOnline(session),可以判斷該用戶是否在線.

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

          主站蜘蛛池模板: 罗定市| 靖边县| 松阳县| 郯城县| 郧西县| 绵竹市| 江陵县| 万源市| 阳原县| 新安县| 阿鲁科尔沁旗| 武乡县| 仙居县| 固镇县| 宿松县| 大同市| 寿宁县| 望江县| 财经| 保定市| 大连市| 波密县| 从化市| 乐陵市| 怀来县| 重庆市| 沾化县| 阿合奇县| 黔东| 自治县| 怀仁县| 大冶市| 巍山| 溧阳市| 潮州市| 海晏县| 仙游县| 嵊州市| 商水县| 安化县| 茂名市|