做项目时有需要做一个运行监控功能,主要监控用户在线的信息,主要通过用户登录和退出时更新数据库中的信息来达到这个目的,但是会出现用户登录后直接关闭浏览器的非法退出操作,这样系统是不知道该用户已经退出的,因此做一个当会话失效时直接更新用户为离线状态,具体如下:

1.实现HttpSessionBindingListener接口来监控会话的 创建和失效。

package com.ctis.ta.web.servlet;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.ctis.ta.dict.SessionStatus;
import com.ctis.ta.dto.TaLoginUserInfo;
import com.ctis.ta.web.service.AqHhglService;


public class FrontOnlineMonitor implements HttpSessionBindingListener {
	
	public ServletContext servletContext;// servlet容器对象
	
	String taLoginUserInfo;
	
	public FrontOnlineMonitor(){
		
	}
	
	public FrontOnlineMonitor(String taLoginUserInfo, ServletContext servletContext){
		super();  
        this.taLoginUserInfo = taLoginUserInfo;
        this.servletContext = servletContext;
	}
	

	private AqHhglService getAqHhglServiceFront() {
		return (AqHhglService)WebApplicationContextUtils
				.getRequiredWebApplicationContext(servletContext).getBean("aqHhglService");
	}

	/**
	 *  创建Session时会调用此方法
	 */
	@Override
	public void valueBound(HttpSessionBindingEvent e) {
		
		HttpSession session = e.getSession();
        ServletContext application = session.getServletContext();
		
		Hashtable activeSessions = (Hashtable) application.getAttribute("activeSessions");  
        
        if (activeSessions == null){
            activeSessions = new Hashtable();  
        }
          
        TaLoginUserInfo sessionUser = (TaLoginUserInfo)e.getSession().getAttribute(this.taLoginUserInfo);  
          
        if (sessionUser != null){
            activeSessions.put(e.getSession().getId(),sessionUser);//将sessionUser放置在hashtable里  
              
        }
      
        application.setAttribute("activeSessions",activeSessions);  

	}

	/*
	 * 会话结束或删除时会调用此方法
	 * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
	 */
	@Override
	public void valueUnbound(HttpSessionBindingEvent e) {
		
		try {
			HttpSession session = e.getSession();
			ServletContext application = session.getServletContext();
			TaLoginUserInfo sessionUser =(TaLoginUserInfo)application.getAttribute(this.taLoginUserInfo);  
			if (sessionUser == null){
  
			    Hashtable activeSessions = (Hashtable) application.getAttribute("activeSessions");   
  
			    if (activeSessions != null){
			          
			            if(activeSessions.containsKey(e.getSession().getId())){
			            	TaLoginUserInfo logon = (TaLoginUserInfo)activeSessions.get(e.getSession().getId());
			            	
			            	// 退出时修改数据表中的在线状态
			            	getAqHhglServiceFront().updateSessionStatusById(logon.getTaCustomer().getId(),
			        				SessionStatus.OFFLINE.toString());
			            	getAqHhglServiceFront().updateSessionTcrqById(logon.getTaCustomer().getId(),
			        				new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
			                
			                activeSessions.remove(e.getSession().getId());   
			              
			                application.setAttribute("activeSessions",activeSessions);  
			            }
			    }
     
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}

	}
}




2.用户登录和退出时加入此监听类

//将监听类加入到session中才能对该session进行监听
			session.setAttribute("bindingSession",new FrontOnlineMonitor(getLoginService().getTaCustomerSessionName(), this.getServletContext()));

session.removeAttribute("bindingSession");


这样在用户正常退出以及session失效时就可以捕捉到并修改用户的在线状态了。