在线用户信息统计&单用户登录

前言:
web开发中,有时我们需要统计在线用户信息及实现单用户登录功能,具体实现如下。

概述:
用户登录成功后,存放到session中,创建监听器监听session状态,及时更新存放登录用户信息的Vector,再通过对比Vector中用户信息实现单用户登录。

设计思路:
1、创建一个类,记录登录用户的基本信息,如用户名、登录时间等;

public class User{
    private String user_name; //用户名
    private String user_guid; //用户的标识(本文使用guid,判断用户的唯一性)
    private String login_tiem; //用户登录时间

    ......提供setget方法、User类的有参构造函数
}

2、创建一个类,定义Vector存放登录用户的信息:

public class UserList{
    private Vector<User> v = new Vector<User>();  //存放登录用户信息
    private static final UserList userList = new UserList();

    public static UserList getInstance() {
        return userList;
    }

    public addUser(User user){
        ......
        //用户信息添加到Vector中
        //用户登录成功后,调用该方法添加用户信息到Vector
    }

    public deleteUser(){
        ......
        //从Vector中删除用户信息
        //用户退出后,调用该方法将用户信息从Vector中删除
    }

    public boolean isExist(String strguid){
        ......
        //根据user_guid保证Vector中用户的唯一性
    }

    public Vector<User> getUserVector(){
        return v;  //返回存放用户信息的Vector
    }
}

3、监听器监听session状态:

public class UserListener implements HttpSessionAttributeListener, ServletContextListener{
    private UserList userList = UserList.getInstance();

    //数据写入session时自动调用   ----->  ActionContext.getContext().getSession().put("user",login);
    public void attributeAdded(HttpSessionBindingEvent event) {
        ......
        /***************************************************************************************
            1、过滤掉非登录用户信息存入session的调用;
            2、从session中获取用户信息,调用userList的isExit方法,判断Vector中是否有该用户信息;
            3、如果Vector中没有该用户信息,则调用addUser方法存入用户信息到Vector;
        ***************************************************************************************/
    }

    //从session中删除数据自动调用  ---->   ActionContext.getContext().getSession().remove("user");
    public void attributeRemoved(HttpSessionBindingEvent event) {
        ......
        /***************************************************************************************
            1、过滤掉非登录用户信息从session中删除的调用;
            2、从session中获取用户信息,调用userList的isExit方法,判断Vector中是否有该用户信息;
            3、如果Vector中有该用户信息,则调用deleteUser方法从Vector中删除用户信息;
        ***************************************************************************************/
    }

    //session已存在"user"属性(已经向session中存入登录用户信息),数据写入session时自动调用
    public void attributeReplaced(HttpSessionBindingEvent event) {
        ......
        /***************************************************************************************
            1、过滤掉非登录用户信息存入session的调用;
            2、从session中获取用户信息,调用userList的isExit方法,判断Vector中是否有该用户信息;
            3、如果Vector中没有该用户信息,则调用addUser方法存入用户信息到Vector;
        ***************************************************************************************/
    }
}

总结:
1、最终登录的用户信息都已存入Vector中,单用户的登录实现,登录前先判断Vector中是否有该用户的信息,如果有拦截,如果没有放行登录;
2、用户退出时,不能单单删除session,因为存在覆盖情况,如多个不同用户登录,此时需要用当前用户与Vector用户信息对比,如果不是最后一个用户,则从Vector删除该用户信息即可,如果是最后一个用户,只需清除session即可;
3、直接关闭浏览器,将对该统计造成影响(无法及时清空session),需等待服务器自动清除,默认为20min,可根据实际项目情况在配置文件中配置session清除时间(具体实现这里就不加阐述了)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值