Servlet监听器及在线用户

Servlet中的监听器分为三种类型
Ⅰ 监听ServletContext、Request、Session作用域的创建和销毁
  (1)ServletContextListener
  (2)HttpSessionListener
  (3)ServletRequestListener
Ⅱ 监听ServletContext、Request、Session作用域中属性变化(增加、修改、删除)
  (1)ServletContextAttributeListener
  (2)HttpSessionAttributeListener
  (3)ServletRequestAttributeListener
  上面两种监听器需要在web.xml中注册
  <listener>
    <listener-class>com.hitech.listener._ServletContextListener</listener-class>
  </listener>
Ⅲ 监听HttpSession中对象状态的改变(被绑定、解除绑定、钝化、活化)
  (1)HttpSessionBindingListener 感知到绑定以及解除绑定
  (2)HttpSessionActivationListener 感知钝化和活化 状态改变
    对象的钝化和活化还需要实现Serializable标记接口,在可以被序列化到文件
  该类型监听器不需要在web.xml中进行配置,通常是JavaBean实现接口。

  显示在线用户功能的实现:
    封装用户信息的JavaBean -- UserBean implements HttpSessionListener
  1、用户登录功能:
    根据用户输入的用户名密码查找数据库中匹配的用户信息,封装为UserBean对象返回并存入Session作用域中,就    可以保存用户的登录的状态
  2、存储用户登录状态的数据结构
    在Web应用加载时就创建出可以存储用户信息和对应Session的Map,使用ServletContextListener监听器
    覆盖public void contextInitialized(ServletContextEvent sce)方法,可以通过sce对象获取ServletContext对象
    Map<UserBean,HttpSession> userMap = new HashMap<UserBean,HttpSession>();
    sce.getServletContext.setAttribute("userMap",userMap);
  3、UserBean实现HttpSessionListener接口
    UserBean实现HttpSessionListener接口后覆盖
    public void valueBound(HttpSessionBindingEvent event) -- UserBean对象存入Session域时触发
      用户登录后时自动触发该方法,可以在这里实现向在线用户列表中添加用户
    通过event.getSession.getServletContext.getAttribute("userMap")获取到存入ServletContext域中的userMap
    userMap.put(this, event.getSession())把当前登录的用户及其Session存入Map中
    public void valueUnbound(HttpSessionBindingEvent event) -- UserBean对象移出Session域触发
      当用户注销或Session超时都会自动触发,可以自动移除用户Session
  4、可能会出现的问题:
    (1)用户会登录两次的情况
      在用户登录时,在Map中检查用户是否已经登录过,如果登录过,先移除之前的Session再登录
      if(userMap.containsKey(bean)){
        userMap.get(bean).invalidate();//销毁之前的Session
      }
    (2)但是HaspMap比较两个bean对象是否相同,依赖hashCode()和equals()方法,所以UserBean还需重写这两个方法才能保证

原文地址:https://www.cnblogs.com/magics/p/3732798.html