package Listener;import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import EntityClass.t_user;//自己定义的包public class OnlineListener implements ServletContextListener,
HttpSessionListener, HttpSessionAttributeListener {
private ServletContext application = null; public void contextDestroyed(ServletContextEvent arg0) { } public void contextInitialized(ServletContextEvent sce) {
application = sce.getServletContext(); Set<t_user> OnlineUsers = new HashSet<t_user>();
application.setAttribute("OnlineUsers", OnlineUsers);
} public void sessionCreated(HttpSessionEvent arg0) { } public void sessionDestroyed(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
t_user logoutUser = (t_user) session.getAttribute("user"); Set<t_user> OnlineUsers = (Set<t_user>) application
.getAttribute("OnlineUsers");
OnlineUsers.remove(logoutUser);
//这个方法是干什么的,下面两个attributeAdded和attributeRemoved不是已经完成功能了吗?
//况且sessionDestroyed后,还从哪里获得到名字叫"user"的这样一个Attribute呢?
} public void attributeAdded(HttpSessionBindingEvent hsbe_add) {
HttpSession session = hsbe_add.getSession();
t_user loginUser = (t_user) session.getAttribute("user"); Set<t_user> OnlineUsers = (Set<t_user>) application
.getAttribute("OnlineUsers");
OnlineUsers.add(loginUser);
} public void attributeRemoved(HttpSessionBindingEvent hsbe_remove) {
t_user logoutUser = (t_user) hsbe_remove.getValue();
Set<t_user> OnlineUsers = (Set<t_user>) application
.getAttribute("OnlineUsers");
OnlineUsers.remove(logoutUser);
} public void attributeReplaced(HttpSessionBindingEvent arg0) { }}
查看在线用户

解决方案 »

  1.   

    //这个方法是干什么的,下面两个attributeAdded和attributeRemoved不是已经完成功能了吗?
    移除用户。理想状态下attributeAdded和attributeRemoved已经完成功能,但是不可否认,如果出现用户直接关闭浏览器、浏览器崩溃等情况,程序就无法通过这两个方法来移除用户。久而久之,程序可能会出现内存泄漏问题。而sessionDestroyed是在session即将失效时调用的,可以移除那些非正常退出的用户。
    //况且sessionDestroyed后,还从哪里获得到名字叫"user"的这样一个Attribute呢?
    该方法被调用时session并未失效。参考java ee API文档关于该方法的说明:Notification that a session is about to be invalidated.
      

  2.   

    attributeAdded:当你调用session.setAtrribute("","")后被触发
    attributeRemoved:当你调用session.removeAtrribute("")后被触发
    Java飞虎队欢迎各路菜鸟老鸟加入一起交流讨论。群号105098806