要有這么一個監聽器,當加入session時就可以觸發一個加入session事件,在session過期時就可以觸發一個刪除事件,那么我們的把要處理的東西加入到這兩個事件中就可以做很多于SESSION相關連的事。如在線用戶的管理,單點登陸等等。
在J2EE中可以實現HttpSessionBindingListener接口,此接口有兩要實現的方法。
 void valueBound(HttpSessionBindingEvent event) 當實現此接口的監聽類和session綁定時觸發此事件。
void valueUnbound(HttpSessionBindingEvent event) 當session過期或實現此接口的監聽類卸裁時觸發此事件。

下面是一個示例解決方案:可以把登陸用戶的信息記錄在緩沖池中,當SESSION過期時,用戶信息自動刪除。
一個用戶信息接口。一個用戶緩沖池。一個HttpSessionBindingListener接口的監聽類。

public interface LoginUserMessage {}

 

public class LoginUserPool {
    
private Map map = new HashMap();
    
private static LoginUserPool loginUserPool = new LoginUserPool();
    
private LoginUserPool(){}
    
public static LoginUserPool getInstance() {
        
return loginUserPool;
    }

    
public void addLoginUserMessage(String sessionId,LoginUserMessage loginUserMessage){
       map.remove(sessionId);
       map.put(sessionId,loginUserMessage);
    }

    
public LoginUserMessage removeLoginUserMessage(String sessionId){
        
return  (LoginUserMessage) map.remove(sessionId);
    }

    
public LoginUserMessage getLoginUserMessage(String sessionId){
        
return (LoginUserMessage) map.get(sessionId);
    }

    
public Map getLoginUserMessages(){
        
return map;
    }

    
public boolean isEmpty(){
        
return  map.isEmpty();
    }

}

 

public class UserLoginListener implements HttpSessionBindingListener{
    
private final Log logger = LogFactory.getLog(getClass());
    
private String sessionId = null;
    
private LoginUserMessage loginUserMessage = null;
    
private LoginUserPool loginUserPool = LoginUserPool.getInstance();

    
public LoginUserMessage getLoginUserMessage() {
        
return loginUserMessage;
    }

    
public void setLoginUserMessage(LoginUserMessage loginUserMessage) {
        
this.loginUserMessage = loginUserMessage;
    }

    
public String getSessionId() {
        
return sessionId;
    }

    
public void setSessionId(String sessionId) {
        
this.sessionId = sessionId;
    }

    
/* (non-Javadoc)
     * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
     
*/

    
public void valueBound(HttpSessionBindingEvent event) {
        
// TODO Auto-generated method stub
        if(this.getLoginUserMessage() != null){
            loginUserPool.addLoginUserMessage(
this.getSessionId(),this.getLoginUserMessage());
            logger.info(
"用戶信息加入緩存池成功");
        }

        
this.setLoginUserMessage(null);
    }


    
/* (non-Javadoc)
     * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
     
*/

    
public void valueUnbound(HttpSessionBindingEvent event) {
        
// TODO Auto-generated method stub
        if(!loginUserPool.isEmpty()){
            loginUserPool.removeLoginUserMessage(sessionId);
            logger.info(
"用戶信息從緩存池中移除成功");
        }

    }


}


這樣子的話,當在應用中把userLoginListener加入到session中時,就會自動把用戶信息加入到緩沖池中了。
如:
 session.setAttribute("userLoginListener",userLoginListener);



(原創,轉載請保留文章出處http://www.tkk7.com/bnlovebn/archive/2007/07/04/128006.html