一、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>