package org.springframework.web;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.ContextLoaderListener;
import util.ToolKit;
import com.sun.org.apache.bcel.internal.generic.NEW;
/**
* 在线统计
* @author 杨伦亮 Jun 5, 2011
*/
public class OnLineUsers extends ContextLoaderListener implements HttpSessionListener {
/** user */
public static final String User_Name = "username";
public static final String User = "user";
/** onLineUsers */
public static final String Application_Users = "onLineUsers";
private static Map<String, String> usersList = new HashMap<String, String>();
private static Log log = LogFactory.getLog(OnLineUsers.class);
public void sessionCreated(HttpSessionEvent se) {
}
@SuppressWarnings("unchecked")
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute(User_Name);
if("".equals(username)){
log.fatal(new StringBuffer(username).append(ToolKit.getDateByType(" yyyy年MM月dd日 HH:mm:ss ")).append(" 退出系统!"));
}
log.info(username +"\t退出系统!");
// 从在线列表中删除用户名
usersList = (Map<String, String>) application.getAttribute(Application_Users);
if(usersList.containsKey(username)){
usersList.remove(username);
application.setAttribute(Application_Users, usersList);
}else{
log.info("用户不在在线列表中!"+usersList);
}
}
private ContextLoader contextLoader;
/**
* Initialize the root web application context.
*/
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
/**
* Create the ContextLoader to use. Can be overridden in subclasses.
* @return the new ContextLoader
*/
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
/**
* Return the ContextLoader used by this listener.
* @return the current ContextLoader
*/
public ContextLoader getContextLoader() {
return this.contextLoader;
}
/**
* Close the root web application context.
*/
public void contextDestroyed(ServletContextEvent event) {
if(this.contextLoader !=null){
this.contextLoader.closeWebApplicationContext(event.getServletContext());
}
}
}