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还需重写这两个方法才能保证
Servlet监听器及在线用户的更多相关文章
- servlet就实现在线用户表
在学习servlet的过程中,学习了如何用servlet实现在线用户表. 只有服务器处于开机状态才会有在线用户表的存在,在服务器关机的情况下自然就不存在在线用户表的说法:所以,楼主认为在线用户表的信息 ...
- Javaweb基础--->利用监听器统计在线用户数量和用户信息
首页布局:index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- Servlet监听器——实现在线登录人数统计小例子
一.概念 servlet监听器的主要目的是给web应用增加事件处理机制,以便更好的监视和控制web应用的状态变化,从而在后台调用相应处理程序. 二.监听器的类型 1.根据监听对象的类型和范围,分为3类 ...
- J2EE用监听器实现同一用户只能有一个在线
这里我们讨论的是已登陆或将要登陆的用户,游客不在讨论的范围之内.这一点大家应该很容易就能理解的吧. 那么我们应该怎样去实现同一用户只能有一个在线这样的一个小功能呢? 有人 ...
- Servlet监听器笔记总结
监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...
- servlet监听器Listener(理论+例子)
Listener采用了观察者模式(24种模式之一),Listener是servlet的监听器,他可以监听客户端的请求.服务器端的操作等, 通过监听器,可以自动激发一些操作.比如:监听在线用户数量 当增 ...
- Java进阶(十三)servlet监听器
servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...
- java基础篇---Servlet监听器
在写此篇前,看了一下园友写的,感觉其基础知识归纳的十分全面,我在此就不累赘的写了,链接地址(http://www.cnblogs.com/sherryueda/p/4273169.html), 我就写 ...
- Servlet监听器统计在线人数
监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...
随机推荐
- bzoj3732: Network(最小生成树+LCA)
3732: Network 题目:传送门 题解: 第一眼就看到最大边最小,直接一波最小生成树. 一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的. 那么事情就变得简单起 ...
- JAXB xml与javaBean的转换
转自:https://blog.csdn.net/lydong_/article/details/79812626 `1. 1.不认识到犯错,然后得到永久的教训. 也不是所谓的教训吧,真正的教训来自于 ...
- js捕获页面回车事件
1.javascript版 document.onkeyup = function (e) { if (window.event)//如果window.event对象存在,就以此事件对象为准 e = ...
- 升级Ubuntu18.04后遇到的坑
升级过程: 直接do-release-update 就可以直接从16.04更新到18.04了. 中间会提升更新一些配置文件, 我大部分都选择了N. 然后就成功升级到18.04了, 显卡驱动什么的都 ...
- VS 2015 C#不能进入断点
工程\属性\生成页面,去掉优化代码勾选.
- Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识
如何更新MSF 1.Windows平台 方法1: 运行msfupdate.bat 在msfconsole里执行命令svn update 或者 方法2: 2.unix/linux平台 方法1: 运行m ...
- 在js中关于同名变量和函数的地位争夺问题
先上一段让大家比较蒙圈的代码,接下来再慢慢讲解 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- LA3231 Fair Share 二分_网络流
Code: #include<cstdio> #include<vector> #include<queue> #include<cstring> #i ...
- 滴滴云安装mysql数据库
Linux CentOS安装配置MySQL数据库 没什么好说的,直接正面刚吧. 安装mysql数据库 a)下载mysql源安装包:wget http://dev.mysql.com/get/mys ...
- mycat详细
MyCAT的优势基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远.业界优 ...