HttpSessionBindListener        监听把自身这个对象绑定到HttpSession对象上、解绑

绑定到HttpSession对象上,其实就是调用session的setAttribute()方法把一个HttpSessionBindListener对象放进去。

解绑就是调用session的removeAttribute()方法把HttpSessionListener对象移除。

HttpSessionBindListener这个监听器比较特殊,其他监听器都是注册后就监听了,而且是一对多监听所有的;

HttpSessionBindListener是注册后,还需要使用session.setAttribute(" " , HttpSessionBindListener对象),将HttpSessionBindListener对象放到某个session中,此HttpSessionBindListener对象才会监听,而且只会监听所在的session。一般一个HttpSessionBindListener只放到一个session中,所以一般是一对一监听的。

@WebListener()
public class MyListener implements HttpSessionBindListener{
public void valueBound(HttpSessionBindingEvent event) { } public void valueUnbound(HttpSessionBindingEvent event) { }
}

JavaWeb中的8个监听器都是接口,不能直接new,需要先实现。

 HttpSession session = request.getSession();
MyListener myListener = new MyListener();
session.setAttribute("listener",myListener);
    session.removeAttribute("listener");

session.setAttribute("listener",myListener);

把我(myListener)放到某个session中了,我开始监听这个session的HttpSessionBindListener对象的添加、移除事件,我自己的添加、移除也算。


统计在线人数

有3种方式。

我们在ServletContext(application域)中设置count参数来记录在线人数。

看怎么理解“在线“这个概念了。

如果正在浏览本站的页面,不管有没有登录,就算是在线,可以使用(1)。

(1)使用HttpSessionListener监听session的创建、销毁

一个在线用户对应一个Session,统计在线人数,只需统计服务器上session对象的数量。

@WebListener()
public class MyListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
//count++;
} public void sessionDestroyed(HttpSessionEvent se) {
//count--
}
}

将session超时时间设置小些,因为默认30min,用户离开后30min这段时间内也算在在线,这样统计的误差略大。

超时时间太小,session频繁销毁、新建,又会增加服务器负担,且新建Session也会有时间开销。

一般人工客服超时时间是2min。

如果在线是指处于登录状态,那上面这种方式就不可行。因为访问本站就会创建session,不需要登录;登出后也可以继续访问、浏览本站的页面,session仍然保留。

这就需要使用(2)、(3)了。

(2)登录时获取ServletContext中的count,+1,登出时-1。

(3)利用HttpSessionBindListener,登录时绑定一个HttpSessionBindListener对象到session中,登出时从session中移出这个HttpSessionBindListener对象。

@WebListener()
public class MyListener implements HttpSessionBindListener{
public void valueBound(HttpSessionBindingEvent event) {
//count++
} public void valueUnbound(HttpSessionBindingEvent event) {
//count--
}
}

(2)、(3)其实是一样的,都是在用户登录、登出时记录一下,只是实现统计功能的代码所写位置不同,一个写在Servlet中,一个写在Listener中。

JavaWeb Listener之HttpSessionBindListener的更多相关文章

  1. JavaWeb——Listener

    一.基本概念 JavaWeb里面的listener是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...

  2. JavaWeb:Listener和Filter

    本文内容: Listener Filter 首发日期:2018-07-15 Listener 监听器Listener负责监听事件的发生.我们能在事件发生后执行一些自定义的操作,这就是监听器的意义. 监 ...

  3. JavaWeb Listener

    1. 监听器概述 1.1. 什么是监听器 做过Swing或者AWT图像界面Java程序开发的话,应该对Listener与Event非常熟悉.Swing或者AWT中通过Listener与Event来处理 ...

  4. JavaWeb Listener之HttpSessionActivationListener ,session钝化、活化

    HttpSessionActivationListener    监听HttpSession对象的活化.钝化 钝化:将HttpSession对象从内存中转移至硬盘,存储为.session文件. 活化: ...

  5. JavaWeb—监听器Listener

    1.简介 Listener是Servlet的监听器,Servlet 监听器用于监听一些重要事件的发生,监听器对象在事情发生前.发生后可以做一些必要的处理. JavaWeb里面的listener是通过观 ...

  6. filter和listener的生命周期

    filter(过滤器)和listener(监听器)的生命周期 老实说 生命周期要是说成作用的时间范围我会理解的更好 filter package com.javaweb.filter; import ...

  7. 监听域对象创建和销毁的Listener

    1.什么是Servlet监听器? 先来看看什么是监听器.监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时立即采取相应的行动.Servlet监听器是S ...

  8. 域对象中属性变更及感知session绑定的事件监听器

    域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...

  9. JavaWEB 通过Listener理解域对象生命周期

    利用 ServletRequestListener.HttpSessionListener 以及 ServletContextListener 可以把request,session,以及Applica ...

随机推荐

  1. 201871010136-赵艳强《面向对象程序设计(Java)》第八周学习总结

    201871010136-赵艳强<面向对象程序设计(Java)>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  2. 使用 Nacos 的 Docker 镜像,启动 Nacos 服务

    1.镜像网址:https://hub.docker.com/r/nacos/nacos-server 2.Clone project git clone --depth 1 https://githu ...

  3. python在windows系统上创建文件

    正确方法为:open("test1.txt",'wb')或open("test1.txt",'w') 以下是网上的方法创建遇到的问题 使用Python2.7在w ...

  4. PAC在异常检测中的应用

    注:资料均来源于网络,本文只做知识分享,如侵立删,谢谢. PAC算法背景简述: 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研 ...

  5. hbase链接失败

    https://blog.csdn.net/u010886217/article/details/84444046

  6. 万字长文把 VSCode 打造成 C++ 开发利器

    https://zhuanlan.zhihu.com/p/96819625 面对大量代码,在开发任务繁重场景下,VSCode 绝对是一把利器.本文虽以 C++为引,但在 python.php.java ...

  7. Excel-数据透视表

    例如: 购买数量采用求和的方式 用户数ID数据采用计数的方式 一.数据透视表的结构 二.数据透视表的步骤 1.订单表 提出问题,理解数据,数据清晰,构建模型,数据可视化 问题1:每个客户的订单量? 问 ...

  8. <DFS & BFS> 130 127

    130. Surrounded Regions BFS: 把所有边界上的O先换成A(标记),再深度遍历周围的点. 最后把O换成X(表示不符合要求),所有的A换回O class Solution { p ...

  9. ORB-SLAM2初步(跟踪模块)

    一.跟踪模块简介 在ORB-SLAM或其他SLAM系统中,跟踪的主要任务是根据相机或视频输入的图像帧实时输出相机位姿.在ORB-SLAM中,跟踪模块的主要任务是实时输出相机位姿和筛选关键帧,完成一个没 ...

  10. VeeValidate——vue2.0表单验证插件

    一.vee-validate入门 vee-validate 是一个轻量级的 vue表单验证插件.它有很多开箱即用的验证规则,也支持自定义验证规则.它是基于模板的,因此它与HTML5验证API类似且熟悉 ...