要有這么一個(gè)監(jiān)聽(tīng)器,當(dāng)加入session時(shí)就可以觸發(fā)一個(gè)加入session事件,在session過(guò)期時(shí)就可以觸發(fā)一個(gè)刪除事件,那么我們的把要處理的東西加入到這兩個(gè)事件中就可以做很多于SESSION相關(guān)連的事。如在線用戶(hù)的管理,單點(diǎn)登陸等等。
在J2EE中可以實(shí)現(xiàn)HttpSessionBindingListener接口,此接口有兩要實(shí)現(xiàn)的方法。
 void valueBound(HttpSessionBindingEvent event) 當(dāng)實(shí)現(xiàn)此接口的監(jiān)聽(tīng)類(lèi)和session綁定時(shí)觸發(fā)此事件。
void valueUnbound(HttpSessionBindingEvent event) 當(dāng)session過(guò)期或?qū)崿F(xiàn)此接口的監(jiān)聽(tīng)類(lèi)卸裁時(shí)觸發(fā)此事件。

下面是一個(gè)示例解決方案:可以把登陸用戶(hù)的信息記錄在緩沖池中,當(dāng)SESSION過(guò)期時(shí),用戶(hù)信息自動(dòng)刪除。
一個(gè)用戶(hù)信息接口。一個(gè)用戶(hù)緩沖池。一個(gè)HttpSessionBindingListener接口的監(jiān)聽(tīng)類(lèi)。

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(
"用戶(hù)信息加入緩存池成功");
        }

        
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(
"用戶(hù)信息從緩存池中移除成功");
        }

    }


}


這樣子的話,當(dāng)在應(yīng)用中把userLoginListener加入到session中時(shí),就會(huì)自動(dòng)把用戶(hù)信息加入到緩沖池中了。
如:
 session.setAttribute("userLoginListener",userLoginListener);



(原創(chuàng),轉(zhuǎn)載請(qǐng)保留文章出處http://www.tkk7.com/bnlovebn/archive/2007/07/04/128006.html