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监听器及在线用户,布布扣,bubuko.com
原文:http://www.cnblogs.com/magics/p/3732798.html