javaWeb防止用户重复登录

网站使用session保存登录用户信息 不过如果在两个浏览器登陆的话服务器就会出现两条session。

要保证用户不重复登录,那么该用户的session应该保证只有一个.

@Component
public class LoadDataCache implements ApplicationListener {

//在线用户(用于控制用户不可重复登录)
private static HashMap ONLINE_OPERS= new HashMap();

    public static boolean isOnline(String oper_no){
        if(ONLINE_OPERS.containsKey(oper_no)){
            return true;
        }
        return false;
    }
    
    public static void addOnline(String oper_no,HttpSession session){
        ONLINE_OPERS.put(oper_no, session);
    }
    public static void removeOnline(String oper_no){
        ONLINE_OPERS.remove(oper_no);
    }
    public static HttpSession getOnlineSession(String oper_no){
        return ONLINE_OPERS.get(oper_no);
    }

}

这里我用实现org.springframework.context.ApplicationListener接口的类存储全局变量ONLINE_OPERS记录已登录的用户.

在登录时判断用户的session是否存在,不存在才可登录,并把登录的session添加到ONLINE_OPERS中.

在session销毁时,从ONLINE_OPERS移除.

public class SessionListener implements HttpSessionListener{

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // TODO Auto-generated method stub
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        //在session销毁的时候,把LoadDataCache的ONLINE_OPERS中保存的值清除
        HttpSession session = event.getSession();
        String oper_no = (String)session.getAttribute("OPER_NO");
        if(!"admin".equals(oper_no)&&oper_no!=null){
            LoadDataCache.removeOnline(oper_no);
        }
    }

}

 需要注意直接关闭浏览器,session是不会立即销毁的,需要用js监听关闭事件,通过ajax通知服务器销毁session.

或者也可以通过将之前的session销毁的方式,来防止用户重复登录.(可以理解为异地登陆挤下线)

LoadDataCache.getOnlineSession(oper_no).invalidate();
LoadDataCache.removeOnline(oper_no);

LoadDataCache.addOnline(oper_no, getSession());

你可能感兴趣的:(java)