动态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)
在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)
相关文章推荐
- Android 用户Session管理的设计方案
- 笔记之Servlet的会话管理技术(cookie、session)(应用:用户自动登录、防表单重复提交)
- 服务端如何识别已登录用户身份之Session管理和Cookie应用
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
- Web应用中基于组的用户权限管理在Spring框架下的实现
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
- LNMP 多用户动态进程管理虚拟主机方案
- Web应用状态管理(Session)
- LNMP 多用户动态进程管理虚拟主机方案
- Web应用——驾培管理系统之系统—用户管理(作者:小圣)
- 在 Web 应用中增加用户跟踪功能
- WebSphere 打包web应用及部署方案
- 分享一个Flex管理系统 Session超时的时候 用户操作时自动提示并跳转到登陆页面的方法
- 负载均衡之---应用请求路由模块的使用(ARR)(六)[使用ARR管理试点方案(涉及到了A/B Testing)]
- 利用Terracotta同步tomcat的Web应用的Session
- 动态创建“WEB用户控件(WEB User Control)”又一方法,及如何调用Web用户控件的方法,如何对控件用户控件中的控件
- JavaScript学习记录总结(七)——dom对象应用之用户简单管理
- MVC用户认证web应用部分三
- java数据库编程——元数据(metadata)+web 与企业应用中的连接管理
- Java使用cookie和session管理用户状态