原文地址:
http://blog.csdn.net/opnmzxcvb/archive/2009/09/15/4554329.aspx
1、了解如何使用HttpSessionListener监听session的销毁。
2、了解如何使用HttpSessionBindingListener监听session的销毁。
一、使用HttpSessionListener编写一个OnlineUserListener。
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中:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1、执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
2、如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<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中进行这一步。
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()方法的代码如下:
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的销毁。
分享到:
相关推荐
`HttpSessionListener`和`HttpSessionBindingListener`虽都属于会话监听器,但在功能和用途上有明显区别。`HttpSessionListener`适用于跟踪整个应用级别的会话生命周期,而`HttpSessionBindingListener`则更适合于...
Listener监听器是一种特殊的类,用于监听 web 应用程序中的 ServletContext、HttpSession、ServletRequest 等域对象的创建和销毁事件,以及监听这些域对象中的属性发生修改的事件。Listener监听器可以分为三类: 1....
在Java Web开发中,Servlet监听器(Servlet Listener)扮演着重要的角色,它是Servlet规范的一部分,允许开发者对Web应用程序中的特定事件进行监听和响应。在这个范例中,我们将深入探讨如何利用监听器来统计在线...
JavaWeb开发技术中的Listener监听器是Java企业级应用开发中的重要组成部分,主要用于监听应用程序中发生的特定事件,并在事件发生时执行相应的处理逻辑。监听器在JavaWeb开发中扮演着关键角色,它们允许开发者对Web...
Servlet中的八大Listener是Java Web开发中的重要组成部分,它们允许开发者监听和响应Web应用程序中的特定事件。这些Listener提供了在Servlet容器...理解并善用这八大Listener是提升Servlet和JSP编程能力的关键步骤。
在Java Web开发中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们分别承担着不同的职责。监听器主要用于监听应用程序中的特定事件,而过滤器则用于在请求处理之前和之后对请求和响应进行拦截,...
### ServletListener大全 #### 概述 在Java Web开发中,`ServletListener`是一类特殊的设计模式,主要用于...通过这种方式,我们可以方便地在Java Web应用程序中使用各种`ServletListener`来监听和响应容器中的事件。
以下将详细解析Listener监听器的生命周期,以及如何在实际项目中应用这些知识点。 ### 监听器的生命周期 监听器的生命周期指的是监听器被创建、执行以及销毁的整个过程。在Servlet规范中,监听器接口主要分为两大...
监听器可以通过web.xml配置或@WebListener注解来绑定。 工作原理:实现了特定接口的类为监听器,用来监听另一个Java类的方法调用或者属性改变;当被监听的对象发生了方法调用或者属性改变后,监听器的对应方法就会...
### Java Web 开发技术:Listener 监听器技术详解 #### 一、课程目标与概述 本章将详细介绍Java Web开发中的监听器技术。通过学习本章内容,读者能够达到以下学习目标: - **理解监听器的概念**:了解监听器的...
Java Servlet监听器是Java Servlet API中的一个重要组成部分,它们允许开发者在...通过对以上知识点的了解,开发者可以在Java Web应用中更好地应用Servlet监听器来监控和响应各种事件,从而实现更加灵活和强大的功能。
在Java Web开发中,特别是在使用Servlet时,我们可以利用监听器来监控和响应对象状态的变化,从而实现动态更新和数据同步。下面将详细阐述这一知识点。 ### 监听器简介 监听器是Java Servlet API提供的一种机制,它...
#### 一、监听器(Listener) 监听器是Java Web应用程序中的一个重要组件,主要用于监听容器中特定事件的发生,并作出相应的反应。在Java Web开发中,监听器主要用来监控应用中某些特定作用域对象的创建、销毁以及...
8. 配置listener监听器 8.1. 使用HttpSessionListener 8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. ...
当特定的事件(如Web应用启动、停止、会话创建、销毁等)发生时,Servlet容器会通过回调Listener中的方法来通知监听器。 **一、基本概念** 观察者模式的核心是订阅和通知。在JavaWeb中,Servlet规范定义了一系列...
这通常通过实现Session监听器来实现。本文将深入探讨如何利用Session监听器来防止同一用户在多个客户端同时登录。 首先,理解Session的基本概念至关重要。Session是服务器为每个用户创建的一种存储机制,用于保存...
配置Listener监听器 - **使用HttpSessionListener**:展示了如何使用HttpSessionListener来监听用户的登录状态。 - **使用HttpSessionBindingListener**:进一步讨论了如何使用HttpSessionBindingListener监听...
#### 第8章 配置Listener监听器 - **使用HttpSessionListener**:监听用户会话的创建和销毁事件。 - **使用HttpSessionBindingListener**:监听对象在会话中的绑定和解除绑定事件。 #### 第9章 封装Taglib组件 - **...
监听器(Listener)是用来监听Web应用程序中某些事件的发生并作出响应的组件。Java Web提供了多种监听器,包括但不限于: - **ServletContextListener**:监听上下文的创建与销毁。 - **ServletRequestListener**:...