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

转自:http://uule.iteye.com/blog/824115

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方法。

Java代码  

  1. import javax.servlet.http.HttpSessionListener;
  2. import javax.servlet.http.HttpSessionEvent;
  3. public class SessionCounter implements HttpSessionListener {
  4. private static int activeSessions =0;
  5. /* Session创建事件 */
  6. public void sessionCreated(HttpSessionEvent se) {
  7. ServletContext ctx = event.getSession( ).getServletContext( );
  8. Integer numSessions = (Integer) ctx.getAttribute("numSessions");
  9. if (numSessions == null) {
  10. numSessions = new Integer(1);
  11. }
  12. else {
  13. int count = numSessions.intValue( );
  14. numSessions = new Integer(count + 1);
  15. }
  16. ctx.setAttribute("numSessions", numSessions);
  17. }
  18. /* Session失效事件 */
  19. public void sessionDestroyed(HttpSessionEvent se) {
  20. ServletContext ctx=se.getSession().getServletContext();
  21. Integer numSessions = (Integer)ctx.getAttribute("numSessions");
  22. <span class="oblog_text">        if(numSessions == null)
  23. numSessions = new Integer(0);
  24. }
  25. else {
  26. int count = numSessions.intValue( );
  27. numSessions = new Integer(count - 1);
  28. }
  29. ctx.setAttribute("numSessions", numSessions);</span>
  30. }
  31. }

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

Java代码  

  1. <listener>
  2. <listener-class>demo.listener.SessionCounter</listener-class>
  3. </listener>

以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
   1.执行session.invalidate()方法时 。
      既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户 列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是 这样。

Java代码  

  1. public void doGet(HttpServletRequest request,HttpServletResponse response)
  2. throws ServletException, IOException {
  3. // 销毁session
  4. request.getSession().invalidate();
  5. // 成功
  6. response.sendRedirect("index.jsp");
  7. }

2.
      如果用户长时间没有访问服务器,超过了会话最大超时时间 ,服务器就会自动销毁超时的session。
      会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。

Java代码  

  1. <session-config>
  2. <session-timeout>1</session-timeout>
  3. </session-config>

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

2.HttpSessionEvent

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

Java代码  

  1. public class ShopSessionListener implements HttpSessionListener {
  2. public void sessionCreated(HttpSessionEvent se) {
  3. }
  4. public void sessionDestroyed(HttpSessionEvent se) {
  5. String sessionid = se.getSession().getId();
  6. EopSite site  =(EopSite)ThreadContextHolder.getSessionContext().getAttribute("site_key");
  7. if(site!=null){
  8. ICartManager cartManager = SpringContextHolder.getBean("cartManager");
  9. cartManager.clean(sessionid,site.getUserid(),site.getId());
  10. }
  11. }
  12. }

se.getSession().getId();

HttpSession 接口中的getId():

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

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

时间: 2024-11-04 18:28:41

使用HttpSessionListener接口监听Session的创建和失效的相关文章

HttpSessionListener接口监听网站在线人数

代码 package com.chinaseacom.store.common; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener {             private long onlineCount;         public v

nginx源码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个web服务器,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字.这里不说各个结构体的构造 只说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞.接受发送的缓冲区.绑定.监听处理) 2

Android 常用控件接口监听

Android控件监听方面,用接口实现监听是最好的,在Android 本身就提供了各种控件监听接口,我们只要按照这样实现,看起来代码会很整洁.实现的效果也是很好的,下面我列举了常用控件的接口监听,layout ,checkbox,RadioGroup,以及listview的单击或者长按监听.下面请看代码,有注释. 本文项目源码地址: 点击此处下载 转载请注明出处: http://blog.csdn.net/qq_16064871 package com.example.impletedemo;

Java监听器中ServletRequestListener监听Request的创建和销毁

ServletRequest和HttpServletRequest的区别 HttpServletRequest和ServletRequest都是接口,HttpServletRequest继承自ServletRequest HttpServletRequest比ServletRequest多了一些针对于Http协议的方法.如getHeader(), getMethod(),getSession()等等. HttpServletRequest 客户端浏览器发出的请求被封装成为一个HttpServle

nginx源代码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个webserver,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是依据配置文件的内容来创建的,在nginx.conf文件里有多少个地址就须要创建多少个监听套接字.这里不说各个结构体的构造 仅仅说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比方非堵塞.接受发送的缓冲区.绑定.监听处

Android 编程下短信监听在小米手机中失效的解决办法

相信很多人写的短信监听应用在小米手机上是拦截不到短信的,这是因为小米对短信的处置权优先分给了系统.我们可以在短信的[设置]→[高级设置]→[系统短信优先]中发现短信的优先处理权默认是分给系统的,只要关闭这个系统优先权,短信监听应用就可以正常的拦截到短信了.   

Spring 监听session 失效方法

public class SessionCounter implements HttpSessionListener { private static int activeSessions =0;   /* Session创建事件 */   public void sessionCreated(HttpSessionEvent event) { //创建session }   /* Session失效事件 */   public void  sessionDestroyed(HttpSessio

关于网络状态监听实时,创建单例网络监测(非实时)

#pragma mark 网络状态监测 -(void)checkNetworkStatus{ //创建一个用于测试的url NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"]; AFHTTPRequestOperationManager *operationManager=[[AFHTTPRequestOperationManager alloc]initWithBaseURL:url]; //根据不同的网络状态改变去做相应

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

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