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还需重写这两个方法才能保证

Servlet监听器及在线用户的更多相关文章

  1. servlet就实现在线用户表

    在学习servlet的过程中,学习了如何用servlet实现在线用户表. 只有服务器处于开机状态才会有在线用户表的存在,在服务器关机的情况下自然就不存在在线用户表的说法:所以,楼主认为在线用户表的信息 ...

  2. Javaweb基础--->利用监听器统计在线用户数量和用户信息

    首页布局:index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. Servlet监听器——实现在线登录人数统计小例子

    一.概念 servlet监听器的主要目的是给web应用增加事件处理机制,以便更好的监视和控制web应用的状态变化,从而在后台调用相应处理程序. 二.监听器的类型 1.根据监听对象的类型和范围,分为3类 ...

  4. J2EE用监听器实现同一用户只能有一个在线

    这里我们讨论的是已登陆或将要登陆的用户,游客不在讨论的范围之内.这一点大家应该很容易就能理解的吧.                那么我们应该怎样去实现同一用户只能有一个在线这样的一个小功能呢? 有人 ...

  5. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  6. servlet监听器Listener(理论+例子)

    Listener采用了观察者模式(24种模式之一),Listener是servlet的监听器,他可以监听客户端的请求.服务器端的操作等, 通过监听器,可以自动激发一些操作.比如:监听在线用户数量 当增 ...

  7. Java进阶(十三)servlet监听器

    servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...

  8. java基础篇---Servlet监听器

    在写此篇前,看了一下园友写的,感觉其基础知识归纳的十分全面,我在此就不累赘的写了,链接地址(http://www.cnblogs.com/sherryueda/p/4273169.html), 我就写 ...

  9. Servlet监听器统计在线人数

    监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...

随机推荐

  1. iOS开发—在@interface,@implementation和@property中变量的定义

    一直搞不懂在OC中变量在@interface和@implementation中有什么区别,定义@property又有什么不同,查了很多资料,总结如下: //ViewController.h @inte ...

  2. BZOJ 3339 线段树

    思路: 考虑离线处理 显然 l固定时 r越大 ans越大 那我们不妨按照l从小到大排序 l->l+1的时候 l到next[l]这段区间都跟a[l]取min就好了 搞颗线段树维护一下 //By S ...

  3. 线程进阶:多任务处理(17)——Java中的锁(Unsafe基础)

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  4. SQL SERVER 将一个数据库中的表和数据复制到另一个数据库中

    第一种情况:将A数据库.dbo.A表的数据追加到B数据库.dbo.B表中 (条件:此时B数据库中已创建好了B表) insert into B数据库.dbo.B表 select * from A数据库. ...

  5. ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化

    1. 概述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式. 2. PTP Queue的存储是很简单的,其实就是FIFO的 ...

  6. span文本自动换行

    .span{ word-wrap: break-word; word-break: break-all; overflow: hidden; }

  7. NOIp2018模拟赛三十六

    好久没打模拟赛了...今天一样是两道国集,一道bzoj题 成绩:13+0+95=108 A题开始看错题了...导致样例都没看懂,结果xfz提醒我后我理解了一个我自认为正确的题意(事实证明我和xfz都错 ...

  8. vue-cli3+typescript+路由懒加载报错问题

    vue-cli3的版本是3.4.1 出现的情况是网页显示正常,但是终端一直提示找不到模块: 如果去掉路由懒加载的方式,就没有报错: 原因是以前我们习惯直接写文件名而不加后缀, 现在使用ts时就需要写v ...

  9. BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

    题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...

  10. lvm硬盘管理及LVM扩容

    1,创建分区 [root@host-10-158-172-44 ~]# fdisk /dev/vda Welcome to fdisk (util-linux 2.23.2). Changes wil ...