沙漠中的鱼

欲上天堂,先下地狱
posts - 0, comments - 56, trackbacks - 0, articles - 119
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

保证网站用户(或管理员)在同一时间只登陆一次在很多场合是很必要的!下面举一个基于Java平台实现的例子。
    第一步:创建SessionListenter类

 

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.log4j.Logger;
import org.jpxx.sw.Constants;
import org.jpxx.sw.Factory; 

/**
 * 该监听器用于监听后台管理员登陆。只允许统一管理员在同一时间登陆一次。
 * 
@author Jun Li
 * 
@version  $Revision: 1.0.2 $, $Date: 2009/01/05 $
 * 
@since 1.0.0
 
*/

public class SessionListener implements HttpSessionListener 

    Logger log 
= Factory.getSingletonInstance().getLogger(SessionListener.class);
    
public void sessionCreated(HttpSessionEvent event) {
    }
 

    
public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session 
= event.getSession();
        
// 获取存储管理员的session
        Object o = session.getAttribute(Constants.JPXX_ADMIN_LOGIN_USERNAME_SESSION);
        
if(o!=null){
            String userName 
= o.toString();
            
// 登陆的用户都存储在Hashtable中,用户退出,从Hashtable中删除该用户
            Factory.getUsers().remove(userName);
            log.error(
"删除用户:" + userName + "       " + new java.util.Date());
        }

    }

}

说明:由于该类来自于项目,有很多操作都进行了封装,您稍作修改即可正常使用。注释掉Logger,声明一个静态变量private static Hashtable user = new Hashtable();在sessionCreated()方法中将刚登陆的用户添加到user中。您还需要写注销的页面(jsp或者servlet),在页面里面调用session.invalidate(); 该方法会触发sessionDestroyed()事件!

    第二部:将该监听器注册到web.xml
<listener>
        
<listener-class>org.jpxx.sw.business.SessionListener</listener-class>
</listener>
说明:仅仅依靠session监听器不可能100%可靠,有可能用户不正常退出(例如直接关闭浏览器、系统断电等等)。针对直接关闭浏览器有如下解决方案:在被关闭的页面里面插入如下语句:
<body scroll="no" onUnload="Jpxx.forceLogout();" onbeforeunload="Jpxx.forceLogout();">

Jpxx.forceLogout()方法通过AJAX技术来强制注销用户,即调用session.invalidate()方法。

转载:http://www.jpxx.org/?tid=54

只有注册用户登录后才能发表评论。


网站导航: