Listener概述

Listener的使用

使用Listener需要实现相应的Listener接口。

public class SessionListenerTest implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent se) {

HttpSession session = se.getSession();

System.out.println("新创建了一个session: " + session);

}

public void sessionDestroyed(HttpSessionEvent se) {

HttpSession session = se.getSession();

System.out.println("销毁了一个session: " + session);

}

}

以上代码实现了HttpSessionListener接口。创建Session时会是服务器调用SessionCreated()方法,销毁Session时服务器调用sessionDestroyed()方法。他们都以HttpSessionEvent对象为参数,可以从该参数中获取session。Listener需要在web.xml中配置才能生效。

配置如下:

<listener>

<listener-class>

com.helloweenvsfei.listener.SessionListenerTest

</listener-class>

</listener>

Listener的分类

1.监听对象的创建与销毁

HttpSessionListener,HttpContextListener,HttpRequestListener分别用于Session,context,request的创建与销毁。

可以一个类实现多个Listener接口,如下代码:

2.监听对象的属性变化

代码如下:

3.监听Session内的对象

HttpSessionBindingListener和HttpSessionActivationListener

HttpSessionBindingListener:当对象被放到Session时执行valueBound(HttpSessionBinding event)方法,对象被移除时执行valueUnbound(HttpSessionBinding event)方法。对象必须实现该Listener接口。

HttpSessionActivationListener:服务器关闭时,会将Session内的内容保存到硬盘上,这个过程叫钝化。服务器启动时会将硬盘内容加载进来。当Session里的对象被钝化时会执行sessionWillPassivate(HttpSessionEvent event),当对象被加载时执行sessionDidActivate(HttpSessionEvent event)。对象必须实现该listener接口。

Listener使用案例(单态登陆)

public class LoginSessionListener implements HttpSessionAttributeListener {

Log log = LogFactory.getLog(this.getClass());

Map<String, HttpSession> map = new HashMap<String, HttpSession>();

public void attributeAdded(HttpSessionBindingEvent event) {

String name = event.getName();

// 登录

if (name.equals("personInfo")) {

PersonInfo personInfo = (PersonInfo) event.getValue();

if (map.get(personInfo.getAccount()) != null) {

// map 中有记录,表明该帐号在其他机器上登录过,将以前的登录失效

HttpSession session = map.get(personInfo.getAccount());

PersonInfo oldPersonInfo = (PersonInfo) session

.getAttribute("personInfo");

log.info("帐号" + oldPersonInfo.getAccount() + "在"

+ oldPersonInfo.getIp() + "已经登录,该登录将被迫下线。");

session.removeAttribute("personInfo");

session.setAttribute("msg", "您的帐号已经在其他机器上登录,您被迫下线。");

}

// 将session以用户名为索引,放入map中

map.put(personInfo.getAccount(), event.getSession());

log.info("帐号" + personInfo.getAccount() + "在" + personInfo.getIp()

+ "登录。");

}

}

public void attributeRemoved(HttpSessionBindingEvent event) {

String name = event.getName();

// 注销

if (name.equals("personInfo")) {

// 将该session从map中移除

PersonInfo personInfo = (PersonInfo) event.getValue();

map.remove(personInfo.getAccount());

log.info("帐号" + personInfo.getAccount() + "注销。");

}

}

public void attributeReplaced(HttpSessionBindingEvent event) {

String name = event.getName();

// 没有注销的情况下,用另一个帐号登录

if (name.equals("personInfo")) {

// 移除旧的的登录信息

PersonInfo oldPersonInfo = (PersonInfo) event.getValue();

map.remove(oldPersonInfo.getAccount());

// 新的登录信息

PersonInfo personInfo = (PersonInfo) event.getSession()

.getAttribute("personInfo");

// 也要检查新登录的帐号是否在别的机器上登录过

if (map.get(personInfo.getAccount()) != null) {

// map 中有记录,表明该帐号在其他机器上登录过,将以前的登录失效

HttpSession session = map.get(personInfo.getAccount());

session.removeAttribute("personInfo");

session.setAttribute("msg", "您的帐号已经在其他机器上登录,您被迫下线。");

}

map.put("personInfo", event.getSession());

}

}

}

代码详解:

每次用户登录时都会将JavaBean personinfo对象放入到session中,此时会触发监听器LoginSessionListener中的attributeAdded方法,该方法获取personinfo的账号并与已有的map集合中信息比对,看是否有重复的,如果有重复的,则获取重复的session,并去除该session的personinfo信息。

HttpSession session = map.get(personInfo.getAccount());

session.removeAttribute("personInfo");

session.setAttribute("msg", "您的帐号已经在其他机器上登录,您被迫下线。");

以上代码之所以可以去除原有登陆信息的原因如下:

在Java中参数传递都是传的引用,因此Map集合中的session都是原始session的引用。

代码HttpSession session = map.get(personInfo.getAccount());获得的便是原始的session。因此删除该session的personInfo便是删除原始session的personInfo。

第7章 监听器Listener的更多相关文章

  1. javaweb学习总结(四十七)——监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  2. javaWeb学习总结(11)- 监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  3. javaWeb学习总结(11)- 监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其 实就是一个实现特定接口的普 ...

  4. [09] 监听器 Listener

    1.事件 1.1 事件的概念 在Servlet中有一个概念叫做监听,顾名思义,就是监听某种事件是否发生.就如你是一家娱乐媒体公司的老板,你派出狗仔队去跟着某些明星,比如你想了解他们的绯闻,或者活动进展 ...

  5. java之Servlet监听器Listener

    常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...

  6. 过滤器Filter与监听器Listener

    过滤器Filter 过滤器也是一种servlet   它也可以对用户的请求进行处理  , 但是他所做的处理,只是一些轻量级的处理.Fileter就好像jsp页面与servlet之间的一道关卡,如果这个 ...

  7. JAVA监听器Listener

    JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...

  8. 过滤器(Filter)、拦截器(Interceptor)、监听器(Listener)

    一.Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle ...

  9. JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

随机推荐

  1. day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等

     DjangoRsetFramework学习---restful规范,解析器组件,Postman等           本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...

  2. Go学习笔记01

    前言 Go(Golang)是Google开发的一种强静态类型.编译型.并发型,并具有垃圾回收功能的编程语言,所以使用Go编写的程序相比nodejs之类的弱类型语言,可以提前在编译阶段发现错误,而且由于 ...

  3. 20155211 2016-2017-2 《Java程序设计》第2周学习总结

    20155211 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 通过对教材的阅读,我理解到Java中对于整数,浮点数等类型的定义与c语言基本相同. 对字面常 ...

  4. 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验知识点 1.参考Intellj I ...

  5. C语言复习20170728

    C语言复习20170728 键盘输入和屏幕输出 字符常量:把字符放在一对单引号内,适用于多数可打印字符. 转义字符: 以反斜线()开头,也是放在一对单引号内,适用于控制字符. .\t,是水平制表符,相 ...

  6. CH03 课下作业

    CH03 课下作业 缓冲区溢出漏洞实验 缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的. 缓冲区溢出 ...

  7. STM32L431驱动带UC1698芯片调试记录

    1, 数据线连接方式,这次使用的是8080格式的接口,如下 2. 主要是信号和数据引脚 DATA0-DATA7  并口的数据 RST 复位信号 WR 写信号 RD 读信号 C/D 数据还是命令 CS片 ...

  8. 【JUC源码解析】FutureTask

    简介 FutureTask, 一个支持取消行为的异步任务执行器. 概述 FutureTask实现了Future,提供了start, cancel, query等功能,并且实现了Runnable接口,可 ...

  9. centos7下python3与python2共存并且开启py3虚拟环境

    因为下载视频需要用到python3环境,今天在我的win上安装下载工具死活安装不上去,在大盘鸡上一下就安装成功了...可能在win上不兼容吧...无奈只能在大盘鸡上进行折腾了,顺便几个笔记 由于大盘鸡 ...

  10. 一、EnterpriseFrameWork框架总体介绍

    EnterpriseFrameWork框架是自己在工作之余的得意之作,经过了几年时间的不断重构,现在终于有了现在的样子:刚开始只是为了方便开发WEB系统,随着项目越做越多,新的功能也就不断补充进去,补 ...