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 ...
随机推荐
- jmeter请求参数中文乱码及无法读取CSV文件解决办法
解决办法:参考http://blog.csdn.net/u012167045/article/details/70868306 版本:2.6 我是修改请求http请中的编码为Content encod ...
- luoguP3704 [SDOI2017]数字表格
题意 默认\(n\leqslant m\) 所求即为:\(\prod\limits_{i=1}^n\prod\limits_{j=1}^mf[\gcd(i,j)]\) 枚举\(\gcd(i,j)\)变 ...
- 集合(List、Set、Map)
一.集合与数组 数组:长度固定,数组元素可以是基本类型,也可以是对象.不适合在对象数量未知的情况下使用. 集合:(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. Java集合类存放 ...
- Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) 题解
Happy Birthday, Polycarp! Make Them Odd As Simple as One and Two Let's Play the Words? Two Fairs Bea ...
- Django2.2 Vue 前后端分离 无法访问Cookie
个人验证后可用配置如下: 环境: - Django 2.2 - djangorestframework 3.9 - django-cors-headers 2.5.3 INSTALLED_APPS = ...
- mission3--dp
A---母牛的故事 题目大意:第一年有一头母牛,每年年初母牛生小母牛,小母牛第四个年头可以开始生小牛. 问第n年有多少头牛. 题解: (1)列出前几项来找规律(2)第i年牛的数量=第i-1年牛的数量+ ...
- 洛谷p3384【模板】树链剖分题解
洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...
- 分析并解决Linux发行版的自带OpenJdk和自己安装的OracleJdk新旧版本冲突问题
解决办法: 从Oraclejdk 目录里可执行文件链接都复制到自己的LINK目录,然后IDE使用LINK变量下的命令 本文没有具体解决方法,只有探索思路........................ ...
- DVWA SQL Injection 通关教程
SQL Injection,即SQL注入,SQLi,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害巨大,常常会导致整个数据库被“脱 ...
- java导出标题多行且合并单元格的EXCEL
场景:项目中遇到有需要导出Excel的需求,并且是多行标题且有合并单元格的,参考网上的文章,加上自己的理解,封装成了可自由扩展的导出工具 先上效果,再贴代码: 调用工具类进行导出: public st ...