`

配置listener监听器(HttpSessionListener和HttpSessionBindingListener)细说

 
阅读更多
from:http://blog.csdn.net/opnmzxcvb/article/details/4554329

1、了解如何使用HttpSessionListener监听session的销毁。
2、了解如何使用HttpSessionBindingListener监听session的销毁。

一、使用HttpSessionListener编写一个OnlineUserListener。

 

  1. package anni;  
  2.   
  3. import java.util.List;  
  4. import javax.servlet.ServletContext;  
  5. import javax.servlet.http.HttpSession;  
  6. import javax.servlet.http.HttpSessionListener;  
  7. import javax.servlet.http.HttpSessionEvent;  
  8.   
  9. public class OnlineUserListener implements HttpSessionListener {  
  10.   
  11.     public void sessionCreated(HttpSessionEvent event) {  
  12.     }  
  13.   
  14.     public void sessionDestroyed(HttpSessionEvent event) {  
  15.         HttpSession session = event.getSession();  
  16.         ServletContext application = session.getServletContext();  
  17.   
  18.         // 取得登录的用户名  
  19.         String username = (String) session.getAttribute("username");  
  20.   
  21.         // 从在线列表中删除用户名  
  22.         List onlineUserList = (List) application.getAttribute("onlineUserList");  
  23.         onlineUserList.remove(username);  
  24.   
  25.         System.out.println(username + "超时退出。");  
  26.     }  
  27.   
  28. }  

 

OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。

从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。

为了让监听器发挥作用,我们将它添加到web.xml中:

 

  1. <listener>  
  2.   <listener-class>anni.OnlineUserListener</listener-class>  
  3. </listener>  

 

以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1、执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。

 

  1. public void doGet(HttpServletRequest request,HttpServletResponse response)  
  2.     throws ServletException, IOException {  
  3.     // 销毁session  
  4.     request.getSession().invalidate();  
  5.     // 成功  
  6.     response.sendRedirect("index.jsp");  
  7. }  

 

2、如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。

 

  1. <session-config>  
  2.     <session-timeout>1</session-timeout>  
  3. </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中进行这一步。

 

  1. public void valueBound(HttpSessionBindingEvent event) {  
  2.     HttpSession session = event.getSession();  
  3.     ServletContext application = session.getServletContext();  
  4.   
  5.     // 把用户名放入在线列表  
  6.     List onlineUserList = (List) application.getAttribute("onlineUserList");  
  7.     // 第一次使用前,需要初始化  
  8.     if (onlineUserList == null) {  
  9.         onlineUserList = new ArrayList();  
  10.         application.setAttribute("onlineUserList", onlineUserList);  
  11.     }  
  12.     onlineUserList.add(this.username);  
  13. }  
 

 

 这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。

valueBound()方法的代码如下:

 

  1. public void valueUnbound(HttpSessionBindingEvent event) {  
  2.     HttpSession session = event.getSession();  
  3.     ServletContext application = session.getServletContext();  
  4.   
  5.     // 从在线列表中删除用户名  
  6.     List onlineUserList = (List) application.getAttribute("onlineUserList");  
  7.     onlineUserList.remove(this.username);  
  8.   
  9.     System.out.println(this.username + "退出。");  
  10. }  

 

 

这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。

valueUnbound的触发条件是以下三种情况:
执行session.invalidate()时。
session超时,自动销毁时。
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。

因此,只要不将listener从session中删除,就可以监听到session的销毁

分享到:
评论

相关推荐

    HttpSessionListener 和HttpSessionBindingListener的区别 单点登录

    `HttpSessionListener`和`HttpSessionBindingListener`虽都属于会话监听器,但在功能和用途上有明显区别。`HttpSessionListener`适用于跟踪整个应用级别的会话生命周期,而`HttpSessionBindingListener`则更适合于...

    Listener监听器1

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

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

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

    listener和filter 监听器和过滤器的介绍以及简单使用(csdn)————程序.pdf

    在Java Web开发中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们分别承担着不同的职责。监听器主要用于监听应用程序中的特定事件,而过滤器则用于在请求处理之前和之后对请求和响应进行拦截,...

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

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

    servlet 监听器范例

    在Java Web开发中,Servlet监听器(Servlet Listener)扮演着重要的角色,它是Servlet规范的一部分,允许开发者对Web应用程序中的特定事件进行监听和响应。在这个范例中,我们将深入探讨如何利用监听器来统计在线...

    监听器.pdf

    监听器可以通过web.xml配置或@WebListener注解来绑定。 工作原理:实现了特定接口的类为监听器,用来监听另一个Java类的方法调用或者属性改变;当被监听的对象发生了方法调用或者属性改变后,监听器的对应方法就会...

    Java实训教程 Java软件开发实战 web开发技术 第6章 listener 共21页.pptx

    ### Java Web 开发技术:Listener 监听器技术详解 #### 一、课程目标与概述 本章将详细介绍Java Web开发中的监听器技术。通过学习本章内容,读者能够达到以下学习目标: - **理解监听器的概念**:了解监听器的...

    Servlet中的八大Listener

    Servlet中的八大Listener是Java Web开发中的重要组成部分,它们允许开发者监听和响应Web应用程序中的特定事件。这些Listener提供了在Servlet容器(如Tomcat)管理的生命周期事件上的扩展点,使得我们能够在恰当的...

    JavaWeb中的监听器与过滤器

    #### 一、监听器(Listener) 监听器是Java Web应用程序中的一个重要组件,主要用于监听容器中特定事件的发生,并作出相应的反应。在Java Web开发中,监听器主要用来监控应用中某些特定作用域对象的创建、销毁以及...

    利用session监听器实现一个客户不能再两个客户端登录。

    这通常通过实现Session监听器来实现。本文将深入探讨如何利用Session监听器来防止同一用户在多个客户端同时登录。 首先,理解Session的基本概念至关重要。Session是服务器为每个用户创建的一种存储机制,用于保存...

    网络应用开发 之 监听对象的属性变更

    通过这个实验,我们不仅了解了如何创建和配置监听器,还实际操作了监听器对HttpSession属性变更的响应。这样的实践有助于加深对Servlet监听器机制的理解,提高我们处理复杂网络应用问题的能力。

    Java基础 Servlet监听器详解

    具体来说,监听器可以监控Web应用中的三个主要对象:ServletContext(代表整个Web应用)、HttpSession(代表一个用户会话)和HttpServletRequest(代表客户端的请求)。下面将详细介绍这些知识点。 1. Servlet监听...

    ServletListener大全

    为了注册这个监听器,需要在`web.xml`文件中添加以下配置: ```xml &lt;listener&gt; &lt;listener-class&gt;com.example.CustomServletContextListener&lt;/listener-class&gt; &lt;/listener&gt; ``` 通过这种方式,我们可以方便地在Java ...

    详解JavaWeb中的 Listener

    当特定的事件(如Web应用启动、停止、会话创建、销毁等)发生时,Servlet容器会通过回调Listener中的方法来通知监听器。 **一、基本概念** 观察者模式的核心是订阅和通知。在JavaWeb中,Servlet规范定义了一系列...

    网页教程《跟姐姐学JSP》

    8. 配置listener监听器 8.1. 使用HttpSessionListener 8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. ...

    jsp手把手图解入门教程pdf

    配置Listener监听器 - **使用HttpSessionListener**:展示了如何使用HttpSessionListener来监听用户的登录状态。 - **使用HttpSessionBindingListener**:进一步讨论了如何使用HttpSessionBindingListener监听...

    jsp入门教程

    #### 第8章 配置Listener监听器 - **使用HttpSessionListener**:监听用户会话的创建和销毁事件。 - **使用HttpSessionBindingListener**:监听对象在会话中的绑定和解除绑定事件。 #### 第9章 封装Taglib组件 - **...

    注解学习笔记

    监听器(Listener)是用来监听Web应用程序中某些事件的发生并作出响应的组件。Java Web提供了多种监听器,包括但不限于: - **ServletContextListener**:监听上下文的创建与销毁。 - **ServletRequestListener**:...

Global site tag (gtag.js) - Google Analytics