Session監聽
阿新 • • 發佈:2019-02-10
1、監聽類:
package com.bigdatalearning.utils; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.bigdatalearning.entity.CourseEntity; import com.bigdatalearning.entity.UserEntity; public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener { private final static Log log = LogFactory.getLog(SessionListener.class); // 儲存當前登入的所有使用者 public static Map<String, HttpSession> loginUser = new HashMap<String, HttpSession>(); // 用這個作為session中的key public static String SESSION_LOGIN_NAME = "user"; // 執行setAttribute的時候, 當這個屬性本來不存在於Session中時, 呼叫這個方法. @Override public void attributeAdded(HttpSessionBindingEvent se) { // 如果新增的屬性是使用者名稱, 則加入map中 if (se.getName().equals(SESSION_LOGIN_NAME)) { UserEntity u = (UserEntity) se.getValue(); HttpSession session = loginUser.remove(u.getUser_name()); if (session != null) { session.removeAttribute("user"); } loginUser.put(u.getUser_name(), se.getSession()); } } // 當執行removeAttribute時呼叫的方法 @Override public void attributeRemoved(HttpSessionBindingEvent se) { // 如果移除的屬性是使用者名稱, 則從map中移除 if (se.getName().equals(SESSION_LOGIN_NAME)) { try { UserEntity u = (UserEntity) se.getValue(); loginUser.remove(u.getUser_name()); } catch (Exception e) { log.debug(e); } } } // 當執行setAttribute時 ,如果這個屬性已經存在, 覆蓋屬性的時候, 呼叫這個方法 @Override public void attributeReplaced(HttpSessionBindingEvent se) { // 如果改變的屬性是使用者名稱, 則跟著改變map if (se.getName().equals(SESSION_LOGIN_NAME)) { UserEntity u = (UserEntity) se.getValue(); HttpSession session = loginUser.remove(u.getUser_name()); /*if (session != null) { session.removeAttribute("user"); }*/ loginUser.put(u.getUser_name(), se.getSession()); } } // session建立時呼叫這個方法 @Override public void sessionCreated(HttpSessionEvent se) { log.debug("SessionListener........session建立-----" + se.getSession().getId()); } // Session失效或者過期的時候呼叫的這個方法, @Override public void sessionDestroyed(HttpSessionEvent se) { // 如果session超時, 則從map中移除這個使用者 try { UserEntity u = (UserEntity) se.getSession().getAttribute("user"); loginUser.remove(u.getUser_name()); } catch (Exception e) { log.debug(e); } } }
2、web.xml配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<listener>
<listener-class> com.bigdatalearning.utils.SessionListener</listener-class>
</listener>