發現對于登錄問題的解決都說用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),可以判斷該用戶是否在線.