package org.quickbundle.project.listener; import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.quickbundle.base.beans.factory.RmBeanFactory; import org.quickbundle.project.IGlobalConstants; import org.quickbundle.project.login.IRmLoginService; public class RmSessionListener implements ServletContextListener, HttpSessionListener, Serializable { /** * 得到Service对象 * * @return Service对象 */ public IRmLoginService getLoginService() { return (IRmLoginService) RmBeanFactory.getBean(IRmLoginService.class.getName()); //得到Service对象,受事务控制 } private static final long serialVersionUID = 8124944319058843901L; private static final String SESSION_ACTIVATION_KEY = "rm.session_activation_key"; private static final AtomicInteger SESSION_COUNT = new AtomicInteger(); private static final Map<String, HttpSession> SESSION_MAP_BY_ID = new ConcurrentHashMap<String, HttpSession>(); private static int defaultMaxInactiveInterval; /** * @return the defaultMaxInactiveInterval */ public static int getDefaultMaxInactiveInterval() { return defaultMaxInactiveInterval; } public RmSessionListener() { super(); } /** * 得到session总数 * @return */ public static int getSessionCount() { return SESSION_COUNT.get(); } //初始化web application public void contextInitialized(ServletContextEvent event) { } //销毁web application public void contextDestroyed(ServletContextEvent event) { SESSION_MAP_BY_ID.clear(); SESSION_COUNT.set(0); } public void sessionCreated(HttpSessionEvent event) { final HttpSession session = event.getSession(); if (session.getAttribute(SESSION_ACTIVATION_KEY) == this) { for (final Map.Entry<String, HttpSession> entry : SESSION_MAP_BY_ID.entrySet()) { final String id = entry.getKey(); final HttpSession other = entry.getValue(); if (!id.equals(other.getId())) { SESSION_MAP_BY_ID.remove(id); } } } else { session.setAttribute(SESSION_ACTIVATION_KEY, this); SESSION_COUNT.incrementAndGet(); } SESSION_MAP_BY_ID.put(session.getId(), session); //初始化defaultMaxInactiveInterval if(defaultMaxInactiveInterval == 0) { defaultMaxInactiveInterval = session.getMaxInactiveInterval(); } } public void sessionDestroyed(HttpSessionEvent event) { final HttpSession session = event.getSession(); SESSION_COUNT.decrementAndGet(); SESSION_MAP_BY_ID.remove(session.getId()); autoCompleteLogout(session); } /** {@inheritDoc} */ public void sessionDidActivate(HttpSessionEvent event) { SESSION_COUNT.incrementAndGet(); SESSION_MAP_BY_ID.put(event.getSession().getId(), event.getSession()); } /** {@inheritDoc} */ public void sessionWillPassivate(HttpSessionEvent event) { SESSION_COUNT.decrementAndGet(); SESSION_MAP_BY_ID.remove(event.getSession().getId()); } /** * 得到所有在线用户 * @return */ public static Map<String, HttpSession> getSessions() { return SESSION_MAP_BY_ID; } /** * 根据sessionId获得session * @param sessionId * @return */ public static HttpSession getSessionById(String sessionId) { return SESSION_MAP_BY_ID.get(sessionId); } /** * session超时或调用session.invalidate()时,找出本session关联的用户登录信息,完成用户的在线记录 * @param session */ private void autoCompleteLogout(HttpSession session) { if(session.getAttribute(IGlobalConstants.RM_USER_VO) != null) { getLoginService().executeDestroyUserInfo(session); } } }