判断用户非正常退出使用场景。比如:一个账号不能重复登录,这时就需要判断用户登录状态。
非正常退出情况:
1.服务器端系统异常。
2.会话超时。
3.未退出的情况下,关闭浏览器。
4.用户网络不稳定掉线。
5.用户在登录的状态下,关机(掉电)了
通常的做法是 允许重复登陆,但是上一个会话就终止了(挤掉上一个用户)
用户登录给一个登录状态。或者将登录信息存到application中。或者redis缓存中。
正常退出
改变用户登录状态。或者清空用户登录信息。httpSession.removeAttribute("now_user");
会话超时
将用户信息保存到session 中。当这个session销毁时。改变用户登录信息。这里使用一个HttpSessionLister这个监听器。监听session的销毁。销毁时进行你所需得操作(改变用户登录状态信息)。
异常退出 方法 一(没试过)
就是前端写个定时器。定时向服务器发送请求。每次请求改变登录信息的时间。定时刷新这个时间。其他用户登录的时候看登录状态和刷新的这个时间。
详细:解决办法是登录状态字段不仅存一个数字代表状态,还要存一个时间字段,用自定义分隔符隔开。然后需要在index,js中写一个定时器,定时向指定路由发送数据包,该路由执行的就是对数据库登录字段的写操作,定时刷新时间。当有其他用户登录已登录账户、上次异常退出账户及已超时退出账户、正常退出账户时,只需要对登录字段的状态和时间进行判断。获取当前时间与该时间做差,比较时间是否超过定时器的间隔时间的整数倍(1、2..),即可。
隐患问题是:在他人异常退出后,可能需要再次正常登录该账号需要一个时间差,不是可以立即登录,因为可能需要上文设置的等待时间间隔(最长等待时间为上文的时间间隔)。
异常退出 方法 二
当另有用户来访问的时候,就判断在application的数据,如果已经有该用户的访问记录,就按IP和时间来判断,是否可以继续。比如说IP不同,但时间隔了很久了,就允许访问
异常退出 方法 三
使用webscoket 定时与 服务器通信。与方法一差不多
异常退出 方法 四
过滤器里面每次过滤请求的时候将请求信息记录刷新此用户此ip的在线状态。其他用户登录的时候判断这个用户上一次发送请求的时间。时间过长就视为掉线。