1. 程式人生 > >Session監聽

Session監聽

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>