获取用户下线时间的实现思路

最近做一个项目,需要记录用户的登录历史信息,其中在用户下线时间的获取上遇到了困难,用户登出网页的方法有三种:
1、使用网站提供的登出功能
2、直接关闭网页
3、直接关闭浏览器、突然断电等

如果用户正常登出,可以直接new Date()获取当前时间,在退出成功后保存相关数据;如果用户关闭网页退出,可以使用js捕捉页面关闭事件;独独在直接关闭浏览器、突然断电这里,大家都知道,如果客户端不发送任何请求,后台就无法判定用户状态。在网上找了很多关于抓取用户下线时间的方法,其中包括使用监听器监听session,设置会话超时时间,当会话创建、销毁时做出相应操作,但是这个方法获得的时间不准确,会话超时时间设置太低,频繁的登录影响用户体验。还有一个方法就是通过心跳检测用户的在线状态,在前台设置一个定时器,从用户登录开始发送请求,当用户离开网站时,定时器就会停止,自然能获得一个相对准确的下线时间。本人采用的便是心跳检测的方法,下面来说说实现方式:
单纯的心跳检测就是给前台提供一个接口,每接收到一次请求就更新一次最后在线时间,但是这种做法非常消耗资源,所以我使用的是缓存代替数据库的作用的方法(缓存的好处就是加快访问速度,减少资源的浪费),将登录用户的登录信息放入缓存,客户端定时器每一次请求都根据唯一标识更新一遍缓存,无论用户是否正常登出,都不会继续执行前台页面定时器,缓存中对应该用户的信息就是最终登录信息。当然,无论使用何种方式获得TA的信息,最终都要把数据放入数据库,而缓存中这时会同时存在在线用户和下线用户,我们即需要把下线这部分用户的登录信息放入数据库,我们如何知道什么时候需要把下线用户的登录信息放入数据库呢?在这里就需要在服务器同样设置一个定时器,定时从缓存中将用户登录信息拿出来,判断哪些用户长时间没有更新过缓存,这些便是下线用户,将他们保存至数据库并移出缓存即可。

上述方法不仅解决了我的需求,并且时间误差可以压缩到自己能接受的最低程度,不过并不建议将页面定时器和服务器定时器的时间间隔设置的太短,否则当会极大的增加服务器的压力。另,这个方法也存在一定的漏洞,即当用户的登录间隔小于服务器定时器的时间间隔时,会出现用户一直在线上的情况。

你可能感兴趣的:(java逻辑,下线时间)