您的位置:首页 > 其它

动态WEB应用中的用户SESSION管理方案

2007-07-05 15:40 686 查看
要有这么一个监听器,当加入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.blogjava.net/bnlovebn/archive/2007/07/04/128006.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐