zoukankan      html  css  js  c++  java
  • 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还需重写这两个方法才能保证

  • 相关阅读:
    goole的protoc文件[test_pb2.py]
    selenium中无页面基本配置
    连接数据库
    python计时器(打包exe即可)
    pip 升级 报No module named 'pip'错怎么处理-百度经验
    人脸识别之识别出某人并标记
    WIN7环境人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
    安装pillow(python的图形界面库) PIL模块安装
    python 用pip安装cv2
    python调用摄像头拍照并保存
  • 原文地址:https://www.cnblogs.com/magics/p/3732798.html
Copyright © 2011-2022 走看看