在线用户列表的一个实现方案

在线用户表结构

b0a909f02fd14735b5a8b7347bd34a1199c.jpg

方案描述

说明

当有用户上线时,插入表中一条数据。用户下线时(或者判断用户离线时)将该条数据删除。

登录时校验

如果用户已经登录,提示“用户已经登录”。

在线用户写入

成功登录时写入表中数据。

用户下线时删除

用户主动退出系统,从表中删除用户userId对应的记录。

用户离线判断

针对异常下线的情况,使用逻辑进行判断:如果用户半个小时内都没有操作,则判断用户已下线,将用户从在线用户表中删除。

技术上难点的实现

一些信息如何存储?比如用户登陆时间(USER_LOGIN_TIME)、用户登录类型(LOGIN_APP_TYPE)、登录设备(LOGIN_DEVICE)等信息

使用token。用户登录成功时,使用token存储用户登陆时间(USER_LOGIN_TIME)、用户登录类型(LOGIN_APP_TYPE)、登录设备(LOGIN_DEVICE)、用户userID(USER_ID)等信息。

所谓的token,就是以下面这种格式

admin&1,2,3&11,12,13&2018-10-10 10:00:00&web&1

将这个字符串进行加密转码(可逆加密),最后得到的就是token。解密时使用String.split(“&”)得到List,按照之前的约定格式就可以获得各种信息。

说白了,就是用户登录成功后将用户登陆时间(USER_LOGIN_TIME)、用户登录类型(LOGIN_APP_TYPE)这些信息作为校验的token返回给用户,然后每次再让用户发送过来进行校验及解析数据。

在哪里解析呢?拦截器,自己定义一个拦截器,注册好,然后用来校验和解析token,获取用户登陆时间(USER_LOGIN_TIME)、用户登录类型(LOGIN_APP_TYPE)这些信息。

如何判断用户半小时内没有操作

单例模式构造一个全局Map

Map(Long userId,Date lastOperaTime)。

拦截器更新用户最后操作时间

注册一个拦截器,每次请求都要根据用户userId更新用户最后操作时间。

定时任务半小时运行一次剔除半小时内没有操作的在线用户

说明

项目比较小,也并非分布式系统,采用的这种简单的方案。

现在用于项目中,还在观察效果。没有最好的方案,合适就好。会根据出现的问题进行修改和优化。

转载于:https://my.oschina.net/u/3866531/blog/2254443

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值