配置listener监听器
注意
还记得我们之前讲过的在线列表吗?第 4.2 节 “例子:在线列表”。我们曾经说过那个在线列表无法判断用户非法退出,很可能造成在线列表无限增大,现在我们可以用listener来弥补这一问题了。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:第 9 章 封装taglib组件。
了解如何使用HttpSessionListener监听session的销毁。
了解如何使用HttpSessionBindingListener监听session的销毁。
8.1. 使用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(会话销毁)事件:
执行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");
}
如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。
8.2. 使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
// 把用户名放入在线列表
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
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);
}
username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。
与之对应的valueUnbound()方法,代码如下:
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的销毁。
例子在08-02目录下,可以与08-01对比一下异同,两者的最终效果是相同的。
http://www.family168.com/tutorial/jsp/html/jsp-ch-08.html
分享到:
相关推荐
Listener监听器1 Listener监听器是一种特殊的类,用于监听 web 应用程序中的 ServletContext、HttpSession、ServletRequest 等域对象的创建和销毁事件,以及监听这些域对象中的属性发生修改的事件。Listener监听器...
监听器配置文件名为`listener.ora`,通常位于Oracle的安装目录下,如`$ORACLE_HOME/network/admin`。这个文件包含了监听器的基本信息,如监听器的名字、使用的网络协议、服务名等。 配置Oracle监听器的过程主要包括...
JavaWeb开发技术中的Listener监听器是Java企业级应用开发中的重要组成部分,主要用于监听应用程序中发生的特定事件,并在事件发生时执行相应的处理逻辑。监听器在JavaWeb开发中扮演着关键角色,它们允许开发者对Web...
### STRUTS:Listener监听器详解 #### 一、引言 在Java Web开发中,监听器(Listener)是十分重要的组成部分,它们主要用于监听特定事件的发生,并执行相应的处理逻辑。Struts框架作为早期流行的MVC架构之一,充分...
2. **listener.ora**:这是Oracle监听器使用的配置文件,其中包含了监听器的地址、端口以及与之关联的服务等信息。 3. **SID**:即Service ID,用于标识数据库实例的名称。 4. **ORACLE_HOME**:Oracle产品的安装...
Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)配置 本文主要介绍 Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)的配置,旨在帮助读者了解 Oracle 网络连接配置的主要组件和配置方法。 一、监听器...
9. SID_LIST_LISTENER:定义配置监听器所针对的 ORACLE 服务的列表。 10. SID_DESC:描述每个 Oracle SID。 11. GLOBAL_DBNAME:标识全局数据库名称。本项应该与当前 Oracle 服务的 init.ora 文件中的 SERVICE_...
在配置监听器之前,需要了解 listener.ora和tnsnames.ora两个文件的作用。listener.ora文件是Oracle Net的配置文件,用于定义监听器的属性,例如监听器的名称、协议、主机名和端口号。tnsnames.ora文件是Oracle Net...
在IT行业中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们在Web应用程序中扮演着不可或缺的角色。本文将详细讲解如何利用监听器进行访问计数以及通过过滤器来过滤非法字符,以确保系统的安全性...
对于Oracle监听器,你可以通过编辑`listener.ora`配置文件来改变监听端口。这个文件通常位于`$ORACLE_HOME/network/admin`目录下。找到监听器的DESCRIPTION部分,修改`PORT`参数为你想要的非冲突端口,比如8081。...
4. 保存配置,监听器的配置文件(listener.ora)通常位于$ORACLE_HOME/network/admin目录下。 客户端的本地服务名配置则涉及以下步骤: 1. 启动客户端的Net Manager,添加新的Net服务名,如myoracle。 2. 选择TCP/...
配置listener.ora文件 `listener.ora`文件是监听器的配置文件,其中包含了监听器的全部配置信息,包括监听地址、端口、实例的SID列表等。正确的配置是实现多实例多监听器的基础。在案例中给出的部分内容展示了如何...
Spring ApplicationListener监听器用法详解 本文主要介绍了Spring框架中的ApplicationListener监听器的用法详解,通过示例代码对 listeners 的实现和使用进行了详细的讲解,对大家的学习或者工作具有一定的参考学习...
在Java Web开发中,监听器(Listener)和过滤器(Filter)是两个非常重要的概念,它们主要用于增强应用程序的功能和性能。下面将详细讲解这两个概念及其应用。 ### 监听器(Listener) 监听器是实现特定接口的Java...
在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的状态。这篇文章将对这两者的应用进行深入的总结。 **过滤器Filter** 过滤器是在...
在Java世界中,"监听器Listener"是一种广泛使用的机制,主要应用于事件驱动编程。它允许程序注册对特定事件的兴趣,并在这些事件发生时接收通知。监听器是接口,实现这些接口的类通常需要被添加到特定组件(如...
`listener.ora`文件是Oracle监听器的配置文件,它定义了监听器的名称、监听的端口以及服务名等信息。当客户端尝试连接到Oracle数据库时,监听器会接收请求,并根据配置转发到相应的数据库实例。以下是一些关于`...
Java Servlet监听器(Listener)是Java Web开发中的一个重要组件,它们允许开发者在特定事件发生时执行自定义逻辑,而无需直接修改原有的业务代码。监听器是Servlet规范的一部分,通过实现特定的接口,开发者可以...
- 监听器的配置通常存储在`listener.ora`文件中,位于`$ORACLE_HOME/network/admin`目录下。这个文件包含了监听器的名称、监听的协议、地址、端口,以及与之关联的数据库实例和服务信息。 - 配置文件可能包含多个...