`

listener监听器

    博客分类:
  • J2EE
 
阅读更多
1、了解如何使用HttpSessionListener监听session的销毁。
2、了解如何使用HttpSessionBindingListener监听session的销毁。
一、使用HttpSessionListener编写一个OnlineUserListener。
[java] view plaincopyprint?
package anni; 
 
import java.util.List; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpSession; 
import javax.servlet.http.HttpSessionListener; 
import javax.servlet.http.HttpSessionEvent; 
 
public class OnlineUserListener implements HttpSessionListener { 
 
    public void sessionCreated(HttpSessionEvent event) { 
    } 
 
    public void sessionDestroyed(HttpSessionEvent event) { 
        HttpSession session = event.getSession(); 
        ServletContext application = session.getServletContext(); 
 
        // 取得登录的用户名 
        String username = (String) session.getAttribute("username"); 
 
        // 从在线列表中删除用户名 
        List onlineUserList = (List) application.getAttribute("onlineUserList"); 
        onlineUserList.remove(username); 
 
        System.out.println(username + "超时退出。"); 
    } 
 


OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
[java] view plaincopyprint?
<listener> 
  <listener-class>anni.OnlineUserListener</listener-class> 
</listener> 

以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1、执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。
[java] view plaincopyprint?
public void doGet(HttpServletRequest request,HttpServletResponse response) 
    throws ServletException, IOException { 
    // 销毁session 
    request.getSession().invalidate(); 
    // 成功 
    response.sendRedirect("index.jsp"); 


2、如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
[java] view plaincopyprint?
<session-config> 
    <session-timeout>1</session-timeout> 
</session-config> 
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。
  下载 (13.11 KB)
2009-7-1 14:37
二、使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
[java] view plaincopyprint?
public void valueBound(HttpSessionBindingEvent event) { 
    HttpSession session = event.getSession(); 
    ServletContext application = session.getServletContext(); 
 
    // 把用户名放入在线列表 
    List onlineUserList = (List) application.getAttribute("onlineUserList"); 
    // 第一次使用前,需要初始化 
    if (onlineUserList == null) { 
        onlineUserList = new ArrayList(); 
        application.setAttribute("onlineUserList", onlineUserList); 
    } 
    onlineUserList.add(this.username); 


这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
[java] view plaincopyprint?
public void valueUnbound(HttpSessionBindingEvent event) { 
    HttpSession session = event.getSession(); 
    ServletContext application = session.getServletContext(); 
 
    // 从在线列表中删除用户名 
    List onlineUserList = (List) application.getAttribute("onlineUserList"); 
    onlineUserList.remove(this.username); 
 
    System.out.println(this.username + "退出。"); 



这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
执行session.invalidate()时。
session超时,自动销毁时。
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。

------------
下面再来看看我们的登录Servlet中使用这个监听器的部分源代码:
   ……
   HttpSession session = req.getSession (true);
   ……
   ///////////////////////////////////////////////////////////////////////
   SessionListener sessionListener=new SessionListener(" IP:"+req.getRemoteAddr()); //对于每一个会话过程均启动一个监听器
       session.setAttribute("listener",sessionListener); //将监听器植入HttpSession,这将激发监听器调用valueBound方法,从而记录日志文件。
///////////////////////////////////////////////////////////////////////
   当系统退出登录时,只需简单地调用session.removeAttribute(“listener”);即可自动调用监听器的valueUnbound方法。或者,当Session Time Out的时候也会调用此方法。
------------------
这里总结下:valueUnbound方法将被以下任一条件触发

a. 执行session.setAttribute("uocl", 非uocl对象) 时。
b. 执行session.removeAttribute("uocl") 时。
c. 执行session.invalidate()时。
d. session超时后。






  • 大小: 222.8 KB
  • 大小: 871.6 KB
分享到:
评论

相关推荐

    Listener监听器1

    Listener监听器1 Listener监听器是一种特殊的类,用于监听 web 应用程序中的 ServletContext、HttpSession、ServletRequest 等域对象的创建和销毁事件,以及监听这些域对象中的属性发生修改的事件。Listener监听器...

    listener监听器demo

    标题"listener监听器demo"和描述"listener监听器小例子"暗示我们将探讨的是一个关于`Listener`的示例代码。 首先,让我们从Java GUI编程的角度来看`Listener`。在Swing或AWT中,我们经常使用各种类型的`Listener`,...

    JavaWeb开发技术-Listener监听器.pptx

    JavaWeb开发技术中的Listener监听器是Java企业级应用开发中的重要组成部分,主要用于监听应用程序中发生的特定事件,并在事件发生时执行相应的处理逻辑。监听器在JavaWeb开发中扮演着关键角色,它们允许开发者对Web...

    STRUTS:listener监听器

    ### STRUTS:Listener监听器详解 #### 一、引言 在Java Web开发中,监听器(Listener)是十分重要的组成部分,它们主要用于监听特定事件的发生,并执行相应的处理逻辑。Struts框架作为早期流行的MVC架构之一,充分...

    JavaWebServlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

    JavaWeb技术是构建基于Java平台的Web应用程序的重要框架,它包括了Servlet、JSP、EL表达式、JSTL标签库、Filter过滤器以及Listener监听器等多个关键组件。这些组件协同工作,使得开发者能够创建动态、交互式的Web...

    JAVALISTENER监听器教程及实例借鉴.pdf

    JAVALISTENER监听器教程及实例借鉴.pdf

    java_listener监听器教程及实例.pdf

    java_listener监听器教程及实例.pdf

    Comet4Listener监听器

    java消息推送技术中的监听器类,用于创建和监听通道数据

    Spring ApplicationListener监听器用法详解

    Spring ApplicationListener监听器用法详解 本文主要介绍了Spring框架中的ApplicationListener监听器的用法详解,通过示例代码对 listeners 的实现和使用进行了详细的讲解,对大家的学习或者工作具有一定的参考学习...

    基于Listener监听器生命周期(详解)

    以下将详细解析Listener监听器的生命周期,以及如何在实际项目中应用这些知识点。 ### 监听器的生命周期 监听器的生命周期指的是监听器被创建、执行以及销毁的整个过程。在Servlet规范中,监听器接口主要分为两大...

    Oracle_LISTENER监听文件参数详

    1. LISTENER:指出一个监听器定义的起始点。它实际上是正被定义的当前监听器的名称。默认的名称是 LISTENER。 2. DESCRIPTION_LIST:描述每个监听位置。 3. DESCRIPTION:描述每个监听位置的详细信息。 4. ...

    Spring Boot的listener(监听器)简单使用实例详解

    "Spring Boot的listener(监听器)简单使用实例详解" 在Spring Boot中,listener(监听器)是一种非常重要的组件,它可以帮助我们在应用程序启动和停止时执行一些特定的任务。今天,我们将详细介绍Spring Boot的...

    Filter过滤器和Listener监听器详解

    Filter过滤器和Listener监听器详解 Filter过滤器 Filter的简介 对资源的访问进行过滤,相当于小区的保安,进去要检查,出去还要检查。 Filter的使用 编写一个类,继承并实现javax.servlet.Filter。 package ...

    JavaWeb新版教程. jsp--什么是Listener监听器.avi

    JavaWeb新版教程. jsp--什么是Listener监听器.avi

    Oracle数据库监听器(LISTENER)和本地服务名(Tnsname)配置.docx

    Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)配置 本文主要介绍 Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)的配置,旨在帮助读者了解 Oracle 网络连接配置的主要组件和配置方法。 一、监听器...

    java监听器的实现和原理详解

    Java监听器的实现和原理详解 Java监听器是一种非常重要的设计模式,在Java中广泛应用于事件驱动编程。监听器模式的主要思想是将事件源和事件处理器分离,使得事件源可以独立于事件处理器,提高了系统的灵活性和可...

    Oracle 监听器 Listener资料.docx

    Oracle 监听器 Listener 资料 Oracle 监听器 Listener 是一个重要的数据库服务器组件,在整个 Oracle 体系结构中,扮演着重要的作用。它负责管理 Oracle 数据库和客户端之间的通讯,它在一个特定的网卡端口(默认是...

    Java中的Listener监听器

    本文介绍了Listener以下几个方面的内容:  · Listener的定义与作用  · Listener的分类与使用  ServletContext监听  Session监听  Request监听  · Listener的应用实例  利用HttpSessionListener统计...

    监听器访问计数过滤非法字符

    在IT行业中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们在Web应用程序中扮演着不可或缺的角色。本文将详细讲解如何利用监听器进行访问计数以及通过过滤器来过滤非法字符,以确保系统的安全性...

Global site tag (gtag.js) - Google Analytics