前言:
web开发中,有时我们需要统计在线用户信息及实现单用户登录功能,具体实现如下。
概述:
用户登录成功后,存放到session中,创建监听器监听session状态,及时更新存放登录用户信息的Vector,再通过对比Vector中用户信息实现单用户登录。
设计思路:
1、创建一个类,记录登录用户的基本信息,如用户名、登录时间等;
public class User{
private String user_name; //用户名
private String user_guid; //用户的标识(本文使用guid,判断用户的唯一性)
private String login_tiem; //用户登录时间
......提供set、get方法、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清除时间(具体实现这里就不加阐述了)。