编写一个OnlineUserListener。

package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;public class OnlineUserListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent event) {}public void sessionDestroyed(HttpSessionEvent event) {HttpSession session = event.getSession();ServletContext application = session.getServletContext();// 取得登录的用户名String username = (String) session.getAttribute("username");// 从在线列表中删除用户名List onlineUserList = (List) application.getAttribute("onlineUserList");onlineUserList.remove(username);System.out.println(username + "超时退出。");}}

OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。

从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。

为了让监听器发挥作用,我们将它添加到web.xml中:

<listener><listener-class>anni.OnlineUserListener</listener-class>
</listener>

以下两种情况下就会发生sessionDestoryed(会话销毁)事件:

  1. 执行session.invalidate()方法时。

    既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。

    public void doGet(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException {// 销毁
        session request.getSession().invalidate();// 成功 response.sendRedirect("index.jsp");
    }

  2. 如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。

    会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。

    <session-config> <session-timeout>1</session-timeout> </session-config>

    时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。

对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。

Listener监听器之HttpSessionListener相关推荐

  1. SpringBatch 监听器之Job监听器(JobExecutionListener)和Step监听器(StepExecutionListener)(五)

    文章目录 一.Job监听器-JobExecutionListener 二.Step监听器-StepExecutionListener 前言:例我们在执行job时候,可能需要在job执行之前预先对一些数 ...

  2. java中的actionlistener_JAVA事件监听器之BUTTON类中的ADDACTIONLISTENER(ACTIONLISTENER L)方法...

    JAVA:事件监听器之Button类中的addActionListener(ActionListener l)方法 addActionListener public void addActionLis ...

  3. web项目下的web.xml listener监听总结

    2019独角兽企业重金招聘Python工程师标准>>> 监听域对象中属性的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, ...

  4. Web三大组件的注册——Servlet、Filter、Listener(监听三大作用域: ServletContext、HttpSession、ServletRequest )

    Web三大组件的注册 Servlet @WebServlet("/user.action") <servlet> </servlet> <servle ...

  5. Flutter Listener 监听手指的滑动方向、监听手指上下滑动

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  6. 红橙Darren视频笔记 自定义RatingBar touch事件学习 dp转px listener监听

    效果图: 一 需求分析 我们需要实现评分的控件 那么主要有几步 1.绘制出评分控件 2.响应用户的触摸改变星星数 3.控件发生星星变化时通知监听者 二 自定义属性 需要属性: 星星总数 选中星星的图片 ...

  7. pacemaker的HA集群无法启动listener监听故障的处理

    项目场景: 提示:这里简述项目相关背景: 之前帮客户在Oracle Linux 7.9下搭建了一套HA集群(pacemaker),最近做测试时候发现了一个集群切换后的BUG. 因为软件安装完全在共享存 ...

  8. Android的Listener监听事件分析

    Android中的回调一直是我难以理解的一部分,总是很容易绕进去,但是细细想一下其实这些方法或者称之为函数都是在一个线程乃至一个进程中执行,肯定会存在先后的顺序,下面就先分析一下Listener,以后 ...

  9. 监听器之jp@gc详解

    一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标   二.jp@gc - Transactions per Second ...

最新文章

  1. WindowsAzurePack Updata1VMM12R2SPF
  2. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
  3. python实现人脸识别_python人脸识别代码实现丨内附代码
  4. qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程
  5. 权限管理系统系列之序言
  6. 《Python Cookbook 3rd》笔记(5.11):文件路径名的操作
  7. obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组
  8. Spring整合Quartz实现定时任务
  9. 廖雪峰Python学习
  10. 21天学通JAVA-第7版 入门到精通完美高清PDFamp;光盘源代码下载
  11. 随机森林模型保存-python
  12. [GIS原理] 9.1 数字高程模型DEM-特征 | 分类 | 构建 | 数据结构 | 空间内插 | DEM的未来
  13. 操作系统实验——进程调度 实验报告
  14. JPA 中 findById()踩过的坑
  15. 音频文件格式转换 转为 wav格式
  16. 我要偷偷的学Python,然后惊呆所有人(第七天)
  17. 网络基础 之SSL协议
  18. 进程间通信简介(二)——管道
  19. NNDL 实验二 pytorch入门
  20. python表情符号编码大全_表情符号,当文本文件包含utf8和utf16时进行编码/解码...

热门文章

  1. activity 的属性android:taskAffinity和android:allowTaskReparenting
  2. springboot集成logback日志 通用logback.xml模板详解
  3. javascript解析json
  4. 看闯关东原来知道古代已经十六进制了
  5. 经典网络VGGNet介绍
  6. C++11中std::lock_guard的使用
  7. 致那些还在创业之路上孤独前行的青年大学生们!
  8. linux终端vi退出命令,如何从命令行关闭vim?
  9. Java解决递归栈溢出_方法递归调用中java栈溢出的问题 及 解答 | 学步园
  10. 鸿蒙法则的能力,真正厉害的人,都懂得这五个做事法则,如能悟透,成功不难...