Listener监听器之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中看到输出的信息。

时间: 2024-10-20 09:49:09

Listener监听器之HttpSessionListener的相关文章

Session监听类HttpSessionListener介绍及在listener里取得request

servlet-api.jar中提供了监听类HttpSessionListener,主要方法有两个,sessionCreated.sessionDestroyed,根据方法名就能明白是监听session的创建和销毁. 首先不可避免的要在sessionCreated方法中想要取得request对象(进而取得用户ip,浏览器等属性),但是HttpSessionEvent显然直接取不到request对象. 研究了下,发现spring(主要是context jar包)提供了监听类:RequestCont

如何绕过oracle listener 监听的密码设置

 如何绕过oracle 监听的密码设置: 1.找到监听进程pid ,并将它kill 掉 ps -ef|grep tns [[email protected] admin]$ ps -ef|grep tns root         9     2  0 Jul11 ?        00:00:00 [netns] oracle   29668     1  0 10:12 ?        00:00:00 /oracle/bin/tnslsnr LISTENER -inherit ora

web项目下的web.xml listener监听总结

监听域对象中属性的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同

Android Listener 监听的几种写法

Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用,其接口定义如下: [java] view plaincopyprint public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clic

怎样绕过oracle listener 监听的password设置

 怎样绕过oracle 监听的password设置: 1.找到监听进程pid ,并将它kill 掉 ps -ef|grep tns [[email protected] admin]$ ps -ef|grep tns root         9     2  0 Jul11 ?        00:00:00 [netns] oracle   29668     1  0 10:12 ?        00:00:00 /oracle/bin/tnslsnr LISTENER -inher

黑马day14 监听器之javaBean对象的活化和钝化

javaBean对象的活化和钝化: 如果将一个属性如String类型的字符串放到session域中,或者一个Person类放到session域中,要想实现session的钝化和活化,则这个javaBean必须实现Serializable接口... 1.javaBean Person package cn.itheima.domain; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListe

ORACLE之手动注册监听listener。alter system set local_listener=&quot;XXX&quot;

记录下刚刚做的一个为一个数据库(t02)配置多个监听(listener)的实验,过程有点小曲折. (1)新增两个测试的监听,listener.ora的配置内容(可纯手动编辑该文件或使用netca)如下: (LISTENER为系统原有:L1.L2为测试用新增的监听) [sql] view plaincopy # listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.

tomcat 服务器的几个重要监听 方法 与 使用

1. 总结一下tomcat 服务器里的三种监听 ServletContextListener HttpSessionListener ServletRequestListener 这是我要做的三个自定义重写 类 分别继承上面三个接口 2具体源码 (1) ServletContextListener 用于监听服务器的启动与关闭 1 package cn.cen2guo.clinic.listener; 2 3 4 import javax.servlet.ServletContextEvent;

oracle 11g 一直提示 严重: 监听程序未启动或数据库服务未注册到该监听程序

From:http://blog.sina.com.cn/s/blog_6734ea6d0102v6sn.html 增加操作系统环境变量:ORACLE_HOSTNAME=localhost 然后在cmd下运行  emca -config dbcontrol db  (如果多个数据库实例,先 执行set oracle_unqname= oralcle_sid,其中oralcle_sid为你的实例名) C:\Documents and Settings\Administrator>emca -con