iLife's 博客http://blog.csdn.net/fei1502816
OnlineUser
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 在線用戶統計
*/
public class OnlineUsers implements HttpSessionBindingListener {
private Map<String, OnlineUser> users = new HashMap<String, OnlineUser>();
private static OnlineUsers onlineUsers = new OnlineUsers();
public static OnlineUsers getInstance() {
return onlineUsers;
}
/**
* @return
*/
public Collection getUsers() {
return users.values();
}
public void addUser(OnlineUser user) {
users.put(user.getId(), user);
}
public void removeUser(String userId) {
users.remove(userId);
}
/**
* 對象實例(即OnlineUserListener的實例)作爲一個屬性被設置到session的
* 時候,會調用本方法,這種情況一般發生在點擊登錄按鈕以後的處理過程中 設置
*
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueBound(HttpSessionBindingEvent event) {
// 現在暫時不需要額外處理,你可以在這裏記錄日誌等
}
/**
* 當Session超時,或本實例被從session中移除的時候被調用,這種情況一般 發生在註銷方法的處理過程中
*
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueUnbound(HttpSessionBindingEvent event) {
try {
HttpSession session = event.getSession();
OnlineUser u = (OnlineUser) session.getAttribute("currentUser");
System.out.println("刪除用戶:"+u.getName());
this.removeUser(u.getId());
} catch (RuntimeException e) {
e.printStackTrace();
// throw e;
}
}
}
OnlineUserListener
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 在線用戶監聽
*/
public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
OnlineUser u = new OnlineUser();
System.out.println("你登錄網站========="+u.getId());
u.setName("---");
u.setId(event.getSession().getId());
event.getSession().setAttribute("currentUser",u);
OnlineUsers.getInstance().addUser(u);
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("刪除用戶:"+event.getSession().getAttribute("currentUser"));
OnlineUsers.getInstance().removeUser(event.getSession().getId());
}
}
OnlineUsers
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 在線用戶統計
* author:
*/
public class OnlineUsers implements HttpSessionBindingListener {
private Map<String, OnlineUser> users = new HashMap<String, OnlineUser>();
private static OnlineUsers onlineUsers = new OnlineUsers();
public static OnlineUsers getInstance() {
return onlineUsers;
}
/**
* @return
*/
public Collection getUsers() {
return users.values();
}
public void addUser(OnlineUser user) {
users.put(user.getId(), user);
}
public void removeUser(String userId) {
users.remove(userId);
}
/**
* 對象實例(即OnlineUserListener的實例)作爲一個屬性被設置到session的
* 時候,會調用本方法,這種情況一般發生在點擊登錄按鈕以後的處理過程中 設置
*
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueBound(HttpSessionBindingEvent event) {
// 現在暫時不需要額外處理,你可以在這裏記錄日誌等
}
/**
* 當Session超時,或本實例被從session中移除的時候被調用,這種情況一般 發生在註銷方法的處理過程中
*
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueUnbound(HttpSessionBindingEvent event) {
try {
HttpSession session = event.getSession();
OnlineUser u = (OnlineUser) session.getAttribute("currentUser");
System.out.println("刪除用戶:"+u.getName());
this.removeUser(u.getId());
} catch (RuntimeException e) {
e.printStackTrace();
// throw e;
}
}
}
web.xml配置
<!-- 設置網站訪問監聽器 -->
<listener>
<listener-class>
com.estone.www.aqjgws.util.bean.OnlineUserListener
</listener-class>
</listener>