JavaWeb Listener之HttpSessionBindListener
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的更多相关文章
- JavaWeb——Listener
一.基本概念 JavaWeb里面的listener是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...
- JavaWeb:Listener和Filter
本文内容: Listener Filter 首发日期:2018-07-15 Listener 监听器Listener负责监听事件的发生.我们能在事件发生后执行一些自定义的操作,这就是监听器的意义. 监 ...
- JavaWeb Listener
1. 监听器概述 1.1. 什么是监听器 做过Swing或者AWT图像界面Java程序开发的话,应该对Listener与Event非常熟悉.Swing或者AWT中通过Listener与Event来处理 ...
- JavaWeb Listener之HttpSessionActivationListener ,session钝化、活化
HttpSessionActivationListener 监听HttpSession对象的活化.钝化 钝化:将HttpSession对象从内存中转移至硬盘,存储为.session文件. 活化: ...
- JavaWeb—监听器Listener
1.简介 Listener是Servlet的监听器,Servlet 监听器用于监听一些重要事件的发生,监听器对象在事情发生前.发生后可以做一些必要的处理. JavaWeb里面的listener是通过观 ...
- filter和listener的生命周期
filter(过滤器)和listener(监听器)的生命周期 老实说 生命周期要是说成作用的时间范围我会理解的更好 filter package com.javaweb.filter; import ...
- 监听域对象创建和销毁的Listener
1.什么是Servlet监听器? 先来看看什么是监听器.监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时立即采取相应的行动.Servlet监听器是S ...
- 域对象中属性变更及感知session绑定的事件监听器
域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...
- JavaWEB 通过Listener理解域对象生命周期
利用 ServletRequestListener.HttpSessionListener 以及 ServletContextListener 可以把request,session,以及Applica ...
随机推荐
- logrotate日志管理工具与split文件切割命令
概述 logrotate是一个Linux系统默认安装了的日志文件管理工具,用来把旧文件轮转.压缩.删除,并且创建新的日志文件.我们可以根据日志文件的大小.天数等来转储,便于对日志文件管理. logro ...
- python的requests库
requests是在爬虫中常用到的一个库,它可以帮助我们很好的去请求我们想要爬取的网站,并返回网站的内容. 0x01:请求 get请求.post请求这两个是最常用的请求方式,此外还有类似delete. ...
- MySQL 5.5/5.6/5.7及以上版本安装包安装时如何选择安装路径
安装环境需求: 自从昨天安装了mysql 5.7,发现了一个问题,mysql5.6起,已经不支持2003系统了,如果安装了无法开启服务而且会出现在 本地计算机 无法启动 MySQL57 服务.错误 1 ...
- Spring Data介绍
Spring Data是Spring 的一个子项目.用于简化数据库访问,支持NoSQL和关系数据库存储.其主要目标是使数据库的访问变得方便快捷. Spring Data 项目所支持NoSQL存储: M ...
- SpringBoot整合FastDFS实现图片的上传
文件的上传和预览在web开发领域是随处可见,存储的方式有很多,本文采用阿里巴巴余庆大神开发的FastDFS进行文件的存储,FastDFS是一个分布式文件存储系统,可以看我上一篇博文,有安装和配置教程 ...
- 基于github发布 个人网站/博客
我们可以使用GitHub去发布自己的网站了(静态网站), 只要经过简单几步即可.这样小伙伴可以给朋友或面试官展示自己个人项目啦. 第一步:创建一个新仓库 第二步:在仓库选择“Settings”页,找到 ...
- node.js与mysql数据库的交互
我们已经建好了数据库也建好了表,现在我们想查询数据库表中的内容,应该怎么做呢? 代码如下: var mysql = require('mysql'); //导入mysql包模块 var connect ...
- java ++a,a++,--a,a--
public class Sample { public static void main(String[] args) {int a, b, c, d, e; Scanner s = new Sca ...
- loj 2719 「NOI2018」冒泡排序 - 组合数学
题目传送门 传送门 题目大意 (相信大家都知道) 显然要考虑一个排列$p$合法的充要条件. 考虑这样一个构造$p$的过程.设排列$p^{-1}_{i}$满足$p_{p^{-1}_i} = i$. 初始 ...
- ROS第一次开网站跳转到公告页(任意地址跳转)方法
原文: http://bbs.routerclub.com/thread-74654-1-5.html ROS首页强开配置脚本: /ip firewall natadd action=dst-nat ...