`

实现session监听器

阅读更多
监听器概述  
 
1.Listener是Servlet的监听器   
2.可以监听客户端的请求、服务端的操作等。  
3.通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。  
4.编写监听器需要实现相应的接口  
5.编写完成后在web.xml文件中配置一下,就可以起作用了  
6.可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪  
 
 
常用的监听接口  
 
1.ServletContextAttributeListener   
监听对ServletContext属性的操作,比如增加/删除/修改   
2.ServletContextListener   
监听ServletContext,当创建ServletContext时,激发 contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。   
3.HttpSessionListener   
监听HttpSession的操作。当创建一个 Session时,激发session Created(SessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。   
4.HttpSessionAttributeListener   
监听HttpSession中的属性的操作。当在Session增加一个属性时,激发 attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。  

 
使用范例:  
由监听器管理共享数据库连接  
 
生命周期事件的一个实际应用由context监听器管理共享数据库连接。在web.xml中如下定义监听器:  
<listener>   
    <listener-class>XXX.MyConnectionManager</listener-class>   
</listener> 

server创建监听器的实例,接受事件并自动判断实现监听器接口的类型。要记住的是由于监听器是配置在部署描述符web.xml中,所以不需要改变任何代码就可以添加新的监听器。  
  
public class MyConnectionManager implements ServletContextListener{     
public void contextInitialized(ServletContextEvent e) {    
        Connection con = // create connection    
        e.getServletContext().setAttribute("con", con);    
    }     
   public void contextDestroyed(ServletContextEvent e) {    
        Connection con = (Connection) e.getServletContext().getAttribute("con");    
        try {   
          con.close();    
        }    
       catch (SQLException ignored) { } // close connection    
    }    
} 
   
监听器保证每新生成一个servlet context都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候随之关闭。    
 
在web.xml中加入:  
<listener><listener-class>servletlistener111111.SecondListener</listener-class> </listener>


==================================================

关于用户超时的例子:

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 + "超时退出。");
    }
}


以下两种情况下就会发生sessionDestoryed(会话销毁)事件:

1.执行session.invalidate()方法时。例如:request.getSession().invalidate();

2.如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。会话超时时间可以在web.xml中进行设置。

========================================

使用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的触发条件是以下三种情况:
1.执行session.invalidate()时。

2.session超时,自动销毁时。

3.执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。


因此,只要不将listener从session中删除,就可以监听到session的销毁。
分享到:
评论

相关推荐

    JAVA SESSION监听器

    在Java中,通过实现HttpSessionListener或HttpSessionAttributeListener接口来创建Session监听器。HttpSessionListener提供了对Session创建、销毁事件的监听,而HttpSessionAttributeListener则可以监听Session属性...

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

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

    session监听小例子

    Session监听器是通过实现`javax.servlet.http.HttpSessionListener`接口或`javax.servlet.http.HttpSessionAttributeListener`接口来创建的。这两个接口提供了对Session生命周期事件的监听方法: 1. `...

    spring session实现session共享

    5. **定制Session行为**: 可以通过实现`SessionRepository`接口来自定义Session的行为,或者通过监听器(`ApplicationListener&lt;SessionDestroyedEvent&gt;`)来监听Session销毁事件。 **实战示例** 在使用Redis作为...

    java web session跨域共享(redis)

    6. **实现Session监听器**:可以创建一个监听Session的监听器,当Session创建、更新、销毁时,同步这些变化到Redis中,保持Redis中的Session与Web服务器上的Session同步。 7. **安全考虑**:使用Redis存储Session...

    使用监听器跟踪session的生命周期和session的属性

    为了更好地理解和管理Session的生命周期及其属性,我们可以使用监听器(Listeners)来实现这一目标。以下是关于使用监听器跟踪Session生命周期和属性的详细解释。 1. **HttpSessionListener**: - `...

    Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...

    session实现记录用户登录状态

    用session记录用户的登录状态 1.登录 2.登录成功后将此“已登录”状态保存。 3.实现“显示员工列表”功能。 4.当用户点击“显示员工列表”的时候,验证用户是否已登录,已登录继续显示员工列表,没有登录则跳转到...

    SpringMVC拦截器实现监听session是否过期详解

    例如,session是如何在HTTP协议中实现的、session过期后如何清除、如何在不同容器中管理session等,这些内容对于理解和实现session监听机制也是十分关键的。总之,通过SpringMVC拦截器来实现对session是否过期的监听...

    javaweb监听session

    首先,为了实现Session监听,我们需要创建一个实现了`javax.servlet.http.HttpSessionListener`接口的类。这个接口定义了两个方法:`sessionCreated(HttpSessionEvent se)`和`sessionDestroyed(HttpSessionEvent se)...

    redis+tomcat实现session的jar

    3. **Session监听器**:在Tomcat中注册监听器,监控session的创建、更新、销毁等事件,并相应地在Redis中进行操作。 4. **配置文件**:可能包含示例或默认的配置文件,用于设置Redis服务器的地址、端口、超时时间等...

    监听session的创建到销毁

    本文将深入探讨如何在Spring MVC项目中实现Session监听,并详细讲解相关知识点。 首先,我们需要了解Session监听器的基本概念。在Java Web应用中,监听器是一种Servlet API组件,它可以监听特定的事件并作出响应。...

    day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付

    在本主题“day18 监听器”中,我们将探讨如何利用监听器来统计在线人数、定时销毁超时session、实现session的钝化与活化,以及如何在系统中显示在线用户列表和实现踢人功能,从而防止用户自动登录。同时,还会涉及...

    单用户登录监听器

    一个自己写的实现单用户登录,单点登录的监听器,一旦新用户登录将会销毁上一个登录用户的session 只需在设置session值之前调用一下重置登录这个方法 值得注意的就是,里面的判断得根据自己的项目中存的session的...

    session监听

    - **监听类编写**:为了实现session监听功能,我们需要编写一个类实现`HttpSessionListener`接口。在这个类中,需要重写两个方法: - `sessionCreated(HttpSessionEvent se)`:当一个新的session被创建时调用此方法...

    判断session过期的方式

    以下是一个简单的Session监听器示例: ```java @WebListener public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener { @Override public void sessionDestroyed...

    基于ZooKeeper的分布式Session实现

    在阅读《基于ZooKeeper的分布式Session实现.doc》文档时,可以期待找到关于如何集成ZooKeeper到现有应用中,以及如何编写相关代码以实现Session管理的详细说明。这份文档可能还会涵盖使用ZooKeeper API的示例,以及...

    tomcat7整合redis实现session共享,jar包带配置方法

    `database`是Redis数据库的编号,`password`是Redis的访问密码(如果有的话),`maxActiveSessions`设置最大活跃session数量,`sessionEventListeners`用于添加session监听器。 4. **配置RedisSessionManager**: ...

    java监听器和过滤器详解

    - **Session监听器**:例如`HttpSessionBindingListener`,用来监听对象与`session`之间的绑定与解绑操作;`HttpSessionActivationListener`用于监听`session`的序列化与反序列化操作,但一般情况下,这些操作是由...

    监听器显示登陆用户列表,并实现踢人功能

    在Java Web开发中,监听器(Listener)是用于监听特定事件的重要组件,它们可以扩展应用程序的功能,例如跟踪用户会话、管理应用上下文等。在本主题中,我们将深入探讨如何利用`HttpSessionAttributeListener`来实现...

Global site tag (gtag.js) - Google Analytics