servlet 相關問題 (一)

 

一、HttpSessionListener 進行同名用戶剔除登錄的方法

 

實現原理,利用HttpSessionListener的監視監聽功能。用戶登錄成功後,在HashMap中放置一組sessionId和userName的組隊,對HashMap中的鍵值信息登錄實時進行維護,利用HashMap來判斷用戶是否已經登錄,當前是否在線,然後根據需要是否進行session(假session,指的是hashmap中保存的鍵值信息)剔除。

1、以下是用於用戶登錄監聽的SessionListener java文件源碼:

/**
* Created by IntelliJ IDEA.
* User: xj
* Date: 2007-3-21
* Time: 17:28:33
* To change this template use File | Settings | File Templates.
*/
public class SessionListener implements HttpSessionListener {
          private static final Logger m_logger = Logger.getLogger(LogonAction.class);//用於log4j調試
          private static HashMap hashUserName = new HashMap();//保存sessionID和username的映射
          /**以下是實現HttpSessionListener中的方法**/
          public void sessionCreated(HttpSessionEvent sessionEvent){
          }

          public void sessionDestroyed(HttpSessionEvent sessionEvent){
              hashUserName.remove(sessionEvent.getSession().getId());
          }

          /**
           * isLogining-用於判斷用戶是否已經登錄
           * @param        sessionUserName String-登錄的用戶名
           * @return boolean-該用戶是否已經登錄的標誌
           * */
          public static boolean isLogining(String sessionUserName) throws Exception{
              return hashUserName.containsValue(sessionUserName);
          }

          /*
           * isOnline-用於判斷用戶是否在線
           * @param session HttpSession-登錄的用戶名稱
           * @return boolean-該用戶是否在線的標誌
           */
          public static boolean isOnline(HttpSession session) throws Exception{
              return hashUserName.containsKey(session.getId());
          }

          /*
          * createUserSession-用於建立用戶session
          * @param sessionUserName String-登錄的用戶名稱
          */
          public static void createUserSession(HttpSession session,String sessionUserName) throws Exception {
              hashUserName.put(session.getId(),sessionUserName);

              if(m_logger.isDebugEnabled()){//log4j調試信息
                  Iterator debugIter = hashUserName.entrySet().iterator();
                  while (debugIter.hasNext()){
                      Map.Entry entry = (Map.Entry)debugIter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      m_logger.debug(sessionUserName);
                      m_logger.debug(key.toString());
                      m_logger.debug(val.toString());
                  }
              }//log4j調試信息結束

          }

          /*
          * createUserSession-根據用戶名剔除session
          * @param sessionUserName String-登錄的用戶名稱
          */
          public static void removeUserSession(String sessionUserName) throws Exception{
              Iterator iter = hashUserName.entrySet().iterator();
                  while (iter.hasNext()){
                      Map.Entry entry = (Map.Entry)iter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      if(((String)val).equals(sessionUserName)){
                        hashUserName.put(key,null);
                          iter.remove();
                        //hashUserName.remove(key);//當使用 fail-fast iterator 對 Collection 或 Map 進行迭代操作過程中嘗試直接修改 Collection / Map 的內容時,即使是在單線程下運行,java.util.ConcurrentModificationException 異常也將被拋出。
                      }
                  }
          }

          /*
          * replaceUserSession-用戶已經登錄則進行session剔除,否則建立新的session
          * @param sUserName String-登錄的用戶名稱
          */
          public static void replaceUserSession(HttpSession session,String sessionUserName) throws Exception {
              if(hashUserName.containsValue(sessionUserName)){//如果該用戶已經登錄過,則使上次登錄的用戶掉線(依據使用戶名是否在hashUserName中)
                  //遍歷原來的hashUserName,刪除原用戶名對應的sessionID(即刪除原來的sessionID和username)
                  Iterator iter = hashUserName.entrySet().iterator();
                  while (iter.hasNext()){
                      Map.Entry entry = (Map.Entry)iter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      if(((String)val).equals(sessionUserName)){
                        hashUserName.put(key,null);
                          iter.remove();
                        //hashUserName.remove(key);//當使用 fail-fast iterator 對 Collection 或 Map 進行迭代操作過程中嘗試直接修改 Collection / Map 的內容時,即使是在單線程下運行,java.util.ConcurrentModificationException 異常也將被拋出。
                    }
                  }
                  hashUserName.put(session.getId(),sessionUserName);//添加現在的sessionID和username
              }else{//如果該用戶沒登錄過,直接添加現在的sessionID和username
                  hashUserName.put(session.getId(),sessionUserName);
              }

              if(m_logger.isDebugEnabled()){//log4j調試信息
                  Iterator debugIter = hashUserName.entrySet().iterator();
                  while (debugIter.hasNext()){
                      Map.Entry entry = (Map.Entry)debugIter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      m_logger.debug(sessionUserName);
                      m_logger.debug(key.toString());
                      m_logger.debug(val.toString());
                  }
              }//log4j調試信息結束

          }
}

 

2、以下是jsp頁面用於判斷用戶是否已登錄(session失效)的部分代碼:

<html:html>
<head>
<title>here is title</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="css/maincss.css" rel="stylesheet" type="text/css">
</head>
<body>
<%
         //UserInfoForm爲後臺定義的獲取用戶登錄信息及保存用戶相關信息的一個java bean,userSession爲用戶登錄Action時根據需要組裝的放置用戶信息的一個bean對象-UserInfoForm,登錄成功後被放到session裏(這裏的session指HttpSession,即服務端根據每個客戶端鏈接產生的帶有唯一sessionId)。
         UserInfoForm userInfoForm = (UserInfoForm)request.getSession().getAttribute("userSession");
         //System.out.println("userName="+userInfoForm.getUserName());
         if(userInfoForm.getUserName()==null||userInfoForm.getUserName().equals("")){//從session獲取用戶信息失敗,用戶沒有登錄或session已經超時,返回到登錄頁面
             RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
          dispatcher.forward(request,response);
         }else{
             if(!SessionListener.isLogining(userInfoForm.getUserName())){//用戶沒有登錄或session已經超時
                 RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
        dispatcher.forward(request,response);
             }else{
                 if(!SessionListener.isOnline(request.getSession())){//當前用戶不在線,即session已經被剔除
                     RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
                     dispatcher.forward(request,response);
                 }
             }
         }
%>
</body>
</html:html>

 

3. 注意:最後別忘了在web.xml文件中配置監聽器SessionListener:

 <listener>
      <listener-class>com.projectsSrcPath.SessionListener</listener-class>
 </listener>

 
    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章