`
uule
  • 浏览: 6335937 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

使用HttpSessionListener接口监听Session的创建和失效

阅读更多

HttpSessionListener :

   Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。

这个接口也只包含两个方法,分别对应于Session的创建和失效:
# public void sessionCreated(HttpSessionEvent se);
# public void sessionDestroyed(HttpSessionEvent se);

 

我的web应用上想知道到底有多少用户在使用?

 

在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些缺点,例如:用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。
  我们可以利用Servlet规范中定义的事件监听器(Listener)来解决这个问题,实现更准确的在线人数统计功能。对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。

import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class SessionCounter implements HttpSessionListener {
private static int activeSessions =0;
/* Session创建事件 */
public void sessionCreated(HttpSessionEvent se) {
      ServletContext ctx = event.getSession( ).getServletContext( );
        Integer numSessions = (Integer) ctx.getAttribute("numSessions");
        if (numSessions == null) {
            numSessions = new Integer(1);
        }
        else {
            int count = numSessions.intValue( );
            numSessions = new Integer(count + 1);
        }
        ctx.setAttribute("numSessions", numSessions);
}
/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se) {
 ServletContext ctx=se.getSession().getServletContext();
 Integer numSessions = (Integer)ctx.getAttribute("numSessions");
        if(numSessions == null)
            numSessions = new Integer(0);
        }
        else {
            int count = numSessions.intValue( );
            numSessions = new Integer(count - 1);
        }
        ctx.setAttribute("numSessions", numSessions);



}
}

  在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:

  <listener>
      <listener-class>demo.listener.SessionCounter</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>

 

      时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。

 

2.HttpSessionEvent

这是类代表一个web应用程序内更改会话事件通知。

 

public class ShopSessionListener implements HttpSessionListener {
	
	public void sessionCreated(HttpSessionEvent se) {

	}	
	public void sessionDestroyed(HttpSessionEvent se) {
		String sessionid = se.getSession().getId();
		EopSite site  =(EopSite)ThreadContextHolder.getSessionContext().getAttribute("site_key");
		
		if(site!=null){
		ICartManager cartManager = SpringContextHolder.getBean("cartManager");
		cartManager.clean(sessionid,site.getUserid(),site.getId());
		}
	}
}

 

se.getSession().getId();

HttpSession 接口中的getId():

          Returns a string containing the unique identifier assigned to this session.

          返回一个字符串,其中包含唯一标识符分配给本次会话。

 

 

分享到:
评论
9 楼 ASD1185240511 2016-08-04  
jacklujuneye 写道
但是 如果客户端 是直接关掉浏览器 就不会调用sessionDestroyed方法  也就不能正确的判断在线人数了。这种该怎么解决呢?

浏览器关闭的时候用ajax的方式向服务端发送清除session的请求
8 楼 cuiyifl 2015-02-03  

    非常实用, 今天用上了
7 楼 l526346744 2013-09-23  
如果客户端 是直接关掉浏览器 session未过期之前 在同一电脑上 同一账号 继续登录 这时不会创建新的session 这个时候怎么办?
6 楼 iswangyg 2013-09-17  
5 楼 TheMatrix 2013-07-27  
jacklujuneye 写道
但是 如果客户端 是直接关掉浏览器 就不会调用sessionDestroyed方法  也就不能正确的判断在线人数了。这种该怎么解决呢?


sessionDestroyed是监听器的方法,它被调用分两种情况:
1)执行session.invalidate()方法时;
2)如果用户长时间没有访问服务器,超过了会话最大超时时间 ,服务器就会自动销毁超时的session。

你说的不就是楼主说的第二种情况吗?!
4 楼 yanxiaoyu 2013-03-15  
恩,楼主解释的很好。
3 楼 jacklujuneye 2013-01-22  
但是 如果客户端 是直接关掉浏览器 就不会调用sessionDestroyed方法  也就不能正确的判断在线人数了。这种该怎么解决呢?
2 楼 cyheye 2013-01-17  
1、session
2、session创建
3、session销毁
1 楼 键盘上的无奈 2012-11-24  
太感谢了 

相关推荐

    session监听小例子

    1. 统计在线用户:通过监听Session的创建和销毁,可以统计网站的实时在线用户数量。 2. 用户行为分析:记录用户Session的活跃时间、访问路径等,用于分析用户行为。 3. 资源管理:在Session销毁时释放占用的资源,...

    设置Session失效的几种方法

    设置Session失效的几种方法 本文介绍了设置Session失效的几种方法,包括在主页面或公共页面中设置Session失效时间、在项目的web.xml中...此外,使用HttpSessionListener可以监听Session的生命周期,执行相应的操作。

    判断session过期的方式

    Java Web应用可以注册Session监听器来监听Session的生命周期事件,包括创建、销毁以及过期。当Session被废弃或过期时,监听器的`sessionDestroyed()`方法会被调用。这可以用来实现自动清理过期Session的功能。以下是...

    session生命周期的设置

    3. **Session监听器**:通过实现HttpSessionListener或HttpSessionAttributeListener接口,可以在Session创建、销毁或属性变化时执行特定操作。 4. **及时清理Session**:为了避免内存泄漏,开发者应合理设计...

    session过期时间设置

    监听器是Java Web应用程序中用于监听特定事件(如Session创建和销毁)的对象。对于Session,我们可以实现`HttpSessionListener`接口。 以下是一个简单的`SessionListener`示例: ```java public class ...

    过滤器和监听器的使用

    例如,Session监听器可以监听会话的创建、过期等事件,ServletContext监听器可以监听上下文的初始化和销毁事件,Request监听器可以监听请求的开始和结束。监听器的实现通常需要实现特定接口,如HttpSessionListener...

    JavaWeb 用session统计在线人数

    3. **session监听**:使用`HttpSessionListener`或`HttpSessionAttributeListener`接口,监听session的创建和销毁事件。在session创建时,`onlineCount`加1;在session销毁(可能是用户主动退出或超时)时,`...

    JavaWeb Session失效时间设置方法

    具体来说,需要实现`HttpSessionListener`接口,并覆盖`sessionCreated`和`sessionDestroyed`两个方法。`sessionCreated`在Session创建时调用,而`sessionDestroyed`在Session失效时调用。 下面是一个简单的示例: ...

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    以上就是使用`SessionListener`、持久化`Session`和`Springmvc拦截器`实现单点登录的基本原理和实现步骤。通过这样的设计,可以有效地提升用户体验,同时确保系统的安全性。在实际项目中,还需要根据具体需求进行...

    memcached实现多个tomcat 共享一个session

    监听器负责将session创建和销毁的事件映射到memcached操作。 4. **session管理策略**:在Tomcat的server.xml配置文件中,设置`&lt;Manager&gt;`元素来指定session管理策略,例如使用`org.apache.catalina.session....

    同一账号不能多地登录

    - **监听器(Listener)**:可以创建一个HttpSessionListener,监听Session的创建和销毁事件。当新的Session被创建(用户登录),则检查是否存在其他已登录的Session。 - **过滤器(Filter)**:使用Servlet ...

    Java Servlet帮助文档

    例如,ServletContextListener可以监听上下文的初始化和销毁事件,HttpSessionListener可以监听会话的创建和失效事件。 综上所述,Java Servlet帮助文档全面涵盖了Servlet的各个方面,无论你是初学者还是经验丰富的...

    HttpSession的使用

    为了监听`HttpSession`的创建、销毁以及属性变化,可以使用`HttpSessionListener`和`HttpSessionAttributeListener`。注册这些监听器可以让我们在特定事件发生时执行相应的操作,如记录日志、清理资源等。 ```java ...

    判断用户是否在线和实时统计在线人数

    3. 使用HttpSessionListener监听会话的创建和销毁,当会话销毁时,从Vector中移除相应的会话ID。 4. 想要获取在线人数时,遍历Vector,计算其中的元素数量,即为当前在线用户数。 5. 为了保证数据的实时性,可以在...

    distributed-session-manager:分布式session管理

    3. **实现Session监听器**:创建一个实现了`javax.servlet.http.HttpSessionListener`接口的监听器,用于监听Session的创建和销毁事件。当新的Session被创建时,将其ID和Session对象存储到Redis;当Session被销毁时...

    Session过期后自动跳转到登录页面的实例代码

    首先,开发者可能尝试使用Session监听器(HttpSessionListener)来检测Session的过期。监听器是Java Servlet规范的一部分,允许我们注册监听器以响应特定的事件,如Session的创建和销毁。在`web.xml`文件中,我们...

    详解Spring MVC拦截器实现session控制

    综合以上,本文通过具体的代码示例和技术细节深入讲解了如何使用Spring MVC拦截器实现session控制,包括如何监听session的创建和销毁,如何实现用户的重复登录控制以及如何在拦截器中处理未登录用户的访问权限问题,...

    网站统计在线人数,当前年、月、日访问量JAVA代码

    1. **创建会话监听器**:在Java Web应用中,可以创建一个实现了javax.servlet.HttpSessionListener的监听器类,用于在session创建和销毁时执行相应的操作。当新session创建时,增加在线人数;当session失效时,减少...

    Servlet规范文档

    例如,`ServletContextListener`可以监听Web应用的启动和关闭,`HttpSessionListener`可以监听会话的创建和失效。 6. **URL映射**:Servlet可以通过`&lt;servlet-mapping&gt;`标签在web.xml配置文件中进行URL映射,将特定...

    java_jsp_day03.pdf

    当用户禁用Cookie时,服务器端无法通过Cookie来识别特定用户,这将导致基于Cookie的Session失效。为解决此问题,可以使用URL重写技术,在每个发送给用户的URL后面附加一个唯一的Session ID,以此来跟踪用户。例如,...

Global site tag (gtag.js) - Google Analytics