首页 > 其他分享 >解决在线用户列表和重复登录

解决在线用户列表和重复登录

时间:2023-05-10 15:32:15浏览次数:58  
标签:在线 登录 getAttribute List 列表 userlist session sessioninfo


解决在线用户列表和重复登录


解决两个问题:
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出

实现方法:
用户登录时,会创建一个session,用于保存用户信息。将所有用户登录时的session值与ID存入ServletContext中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。

参考代码:
存放的时候有很多中方法,我选择的是将session值与ID先存入一个List,在将这个List存入另一个List,再存到ServletContext中。
代码仅供参考,有不合理的地方,希望大家给出意见。

引用


============================1. 登录部分============================ 
  
Java代码 
  
//先从ServletContext中获得存放sessioninfo的List    
  
List userlist = (List) this.servlet.getServletContext()    
  
                         .getAttribute("userlist");    
  
//如果是首个用户登录,sessionlist为空,new一个    
  
if (userlist == null) {    
  
       userlist = new ArrayList();    
  
    }    
  
//遍历List    
  
for (int i = 0; i < userlist.size(); i++) {    
  
       List sessionInfoTemp = (List) userlist.get(i);    
  
       //检查是否存在一个与当前session值相同,但是ID不同的记录    
  
if(sessionInfoTemp.get(0).toString().equals(session.getAttribute("emp").toString())&& !(sessionInfoTemp.get(1).equals(session.getId()))) {    
  
                         //如果存在,remove这一记录    
  
                         userlist.remove(sessionInfoTemp);    
  
              }    
  
    }    
  
// 把session值、ID 存入 sessioninfo    
  
List sessioninfo = new ArrayList();    
  
sessioninfo.add(session.getAttribute("emp"));    
  
sessioninfo.add(session.getId());    
  
//sessioninfo 存入 List    
  
userlist.add(sessioninfo);    
  
//List存入ServletContext    
  
this.servlet.getServletContext().setAttribute("userlist", userlist);   
  

//先从ServletContext中获得存放sessioninfo的List 
  
List userlist = (List) this.servlet.getServletContext() 
  
                         .getAttribute("userlist"); 
  
//如果是首个用户登录,sessionlist为空,new一个 
  
if (userlist == null) { 
  
       userlist = new ArrayList(); 
  
    } 
  
//遍历List 
  
for (int i = 0; i < userlist.size(); i++) { 
  
       List sessionInfoTemp = (List) userlist.get(i); 
  
       //检查是否存在一个与当前session值相同,但是ID不同的记录 
  
if(sessionInfoTemp.get(0).toString().equals(session.getAttribute("emp").toString())&& !(sessionInfoTemp.get(1).equals(session.getId()))) { 
  
                         //如果存在,remove这一记录 
  
                         userlist.remove(sessionInfoTemp); 
  
              } 
  
    } 
  
// 把session值、ID 存入 sessioninfo 
  
List sessioninfo = new ArrayList(); 
  
sessioninfo.add(session.getAttribute("emp")); 
  
sessioninfo.add(session.getId()); 
  
//sessioninfo 存入 List 
  
userlist.add(sessioninfo); 
  
//List存入ServletContext 
  
this.servlet.getServletContext().setAttribute("userlist", userlist); 
  
 


   引用 
 
 
 

   ============================2. 监听部分============================ 
  
Java代码 
  
public void sessionDestroyed(HttpSessionEvent arg0) {    
  
       // TODO Auto-generated method stub    
  
    HttpSession session = arg0.getSession();    
  
    if(session.getAttribute("emp")!=null){    
  
    List list = (List)session.getServletContext().getAttribute("userlist");    
  
    List userTemp = new ArrayList();    
  
    userTemp.add(session.getAttribute("emp"));    
  
    userTemp.add(session.getId());    
  
    list.remove(userTemp);    
  
    session.getServletContext().setAttribute("userlist", list);    
  
    }    
  
}   
  

public void sessionDestroyed(HttpSessionEvent arg0) { 
  
       // TODO Auto-generated method stub 
  
    HttpSession session = arg0.getSession(); 
  
    if(session.getAttribute("emp")!=null){ 
  
    List list = (List)session.getServletContext().getAttribute("userlist"); 
  
    List userTemp = new ArrayList(); 
  
    userTemp.add(session.getAttribute("emp")); 
  
    userTemp.add(session.getId()); 
  
    list.remove(userTemp); 
  
    session.getServletContext().setAttribute("userlist", list); 
  
    } 
  
} 
  
 

   引用 
 
 
 

   ============================3. 过滤部分============================ 
  
Java代码 
  
public void doFilter(ServletRequest req, ServletResponse res,    
  
           FilterChain chain) throws IOException, ServletException {    
  
  
  
       HttpServletRequest request = (HttpServletRequest) req;    
  
       HttpServletResponse response = (HttpServletResponse) res;    
  
       HttpSession session = request.getSession();    
  
  
  
       /**   
  
* 同一用户二次登陆问题 用户请求的提交到这里,通过检查List总的记录销毁session   
  
        */    
  
       // 从ServletContext中取出List    
  
List sessionlist = (List) session.getServletContext().getAttribute(    
  
              "userlist");    
  
       if (sessionlist == null) {    
  
           sessionlist = new ArrayList();    
  
       }    
  
       // 用于记录状态    
  
       boolean temp = false;    
  
       Iterator it = sessionlist.iterator();    
  
       while (it.hasNext()) {    
  
           List sessioninfo = (List) it.next();    
  
  
  
           /**   
  
            * 判断: 如果sessioninfo中没有当前session的值与ID信息,则表明该用户已经第二次登陆了   
  
            * 登陆的时候第一次登陆时候的信息被从List中移除了。   
  
            */    
  
           if (sessioninfo.get(0).toString().equals(    
  
                  session.getAttribute("emp").toString())    
  
                  && sessioninfo.get(1).equals(session.getId())) {    
  
              // session值与当前ID匹配    
  
              temp = true;    
  
           }    
  
       }    
  
       // 存在了第二次登陆,销毁session    
  
        if (!temp) {    
  
           session.invalidate();    
  
       }    
  
  
  
       String strSession = null;    
  
       try {    
  
           strSession = session.getAttribute("emp").toString();    
  
       } catch (Exception e) {    
  
       }    
  
       /**   
  
        * 如果session为空,返回登陆页面   
  
        */    
  
       if (strSession == null) {    
  
           response.setCharacterEncoding("gb2312");    
  
           response    
  
                  .getOutputStream()    .print("<script>window.top.location.href='/index.jsp';alert('超时或账号在其它地方登录,请重新登录!');</script>");    
  
       } else {    
  
           chain.doFilter(req, res);    
  
       }    
  
    }

标签:在线,登录,getAttribute,List,列表,userlist,session,sessioninfo
From: https://blog.51cto.com/u_873039/6262320

相关文章

  • 基于一阶RC模型,电池带遗忘因子递推最小二乘法+扩展卡尔曼滤波算法(FFRLS+ EKF),参数与SOC
    基于一阶RC模型,电池带遗忘因子递推最小二乘法+扩展卡尔曼滤波算法(FFRLS+EKF),参数与SOC的在线联合估计,matlab程序YID:76100659957301925......
  • 基于二阶RC模型锂电池扩展卡尔曼+无迹卡尔曼滤波算法联合估计EKF-UKF,其中EKF在线辩识
    基于二阶RC模型锂电池扩展卡尔曼+无迹卡尔曼滤波算法联合估计EKF-UKF,其中EKF在线辩识所有模型参数欧姆内阻,极化电阻电容,UKF估计soc,循环递推matlab脚本程序sci参考文献ID:26349673074081614......
  • 聚合报告列表项介绍
    聚合报告列表项介绍1、Label:请求的名称,就是脚本中Sampler的名称。2、#Samples(样本):总共发给服务器的请求数量,如果模拟10个用户,每个用户迭代10次,那么总的请求数为:10*10=100次。3、Average(平均值):默认情况下是单个Request的平均响应时间,当使用了TransactionController(事务控制器)......
  • 转载:用pageOffice控件实现 office word文档在线编辑 表格中写数据的方法
    PageOffice对Word文档中Table的操作,包括给单元格赋值和动态添加行的效果。 1应用场景OA办公中,经常要在文档的指定位置表格,填充后端指定数据。如word文档中,表格数据   如下表格中 人员信息人员信息表公司名称部门名称员工姓名A公司开发部李......
  • rocky linux: 禁止使用root登录ssh,只允许指定用户(Rocky Linux 9.1)
    一,配置可以sudo的用户参考这个:https://www.cnblogs.com/architectforest/p/17386259.html二,禁止使用root登录ssh1,配置ssh[root@img~]#vi/etc/ssh/sshd_config配置内容:设置PermitRootLogin值为no#PermitRootLoginyesPermitRootLoginno新增一行:AllowUsers......
  • BBS登录
    随机验证码需要导入的模块"""图片相关的模块pip3installpillow"""fromPILimportImage,ImageDraw,ImageFont"""Image:生成图片ImageDraw:能够在图片上乱涂乱画ImageFont:控制字体样式"""fromioimportBytesIO,StringIO&quo......
  • React笔记-渲染列表Key(五)
    React学习笔记-渲染列表Key(五)渲染列表需要添加key属性importReactfrom"react"exportdefaultclassLearnKeyextendsReact.Component{state={infos:[{name:'Bob',age:18},{name:'kitty',age:20},{name:......
  • 注册和登录
    表结构设计fromdjango.dbimportmodels#Createyourmodelshere.fromdjango.contrib.auth.modelsimportAbstractUser'''先写普通字段,再考虑外键字段'''#用户表classUserInfo(AbstractUser):#继承了Auth模块,下面是我们额外加的字段phone=model......
  • 10. 列表
    列表是可变的1.1什么是列表一个排列整齐的队伍,Python采用顺序表实现列表内的个体称作元素,由若干元素组成列表元素可以是任意对象(数字、字符串、对象、列表等)列表内元素有顺序,可以使用索引线性的数据结构使用[]表示列表是可变的1.2列表的构造ls1=[]ls2=li......
  • 实践|如何搭建在线客服功能
    本文将指引您通过腾讯云呼叫中心,实现在线客服功能。以下为配置在线客服功能的流程,您可根据自己的情况,按需查看步骤:操作步骤步骤1:创建应用1. 注册腾讯云帐号并认证2.前往云呼叫中心控制台创建应用。( 快速创建TCCC应用)步骤2:配置客服1.登录云呼叫中心管理......