import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* java統計用戶在線狀態
* @author sunlightcs
* 2011-6-26
* http://hi.juziku.com/sunlightcs/
*/
public class OnLineUserListener implements HttpSessionAttributeListener {
/**
* 存放在線用戶列表
*/
public static List<Integer> onLineUserList = new LinkedList<Integer>();
/**
* 根據用戶ID,查詢用戶是否在線
* @param userId 用戶ID
* @return true:表示用戶在線 false:表示用戶離線
*/
public static boolean findUserOnLine(Integer userId){
return onLineUserList.contains(userId);
}
/**
* 用戶登錄時候,把用戶的信息存到userSession裏
* UserSession類的結構很簡單,只有userId,userName兩個屬性
*/
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
if ("userSession".equals(se.getName())){
/**
* 用戶上線的話,把用戶的ID,添加到onLineUserList裏
*/
Integer userId = ((UserSession)se.getValue()).getUserId();
onLineUserList.add(userId);
System.out.println("用戶ID:"+userId + " 上線了。。。");
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
if ("userSession".equals(se.getName())){
/**
* 用戶下線的話,把用戶的ID,從onLineUserList中移除
*/
Integer userId = ((UserSession)se.getValue()).getUserId();
onLineUserList.remove(userId);
System.out.println("用戶ID:"+userId + " 下線了。。。");
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
}
監聽器的代碼寫好後,就要把加這類加到web.xml文件裏,這樣纔可以達到監聽的作用。
web.xml裏,加入的代碼如下:
<!-- 監聽用戶狀態 在線或離線 -->
<listener>
<listener-class>com.xxx.util.OnLineUserListener</listener-class>
</listener>
<!--設置會話過期時間爲10分鐘 如果不設置,默認是30分鐘-->
<session-config>
<session-timeout>10</session-timeout>
</session-config>