1:项目背景

一个项目往往会有小程序APP,PC等多端拜访,比方淘宝,京东等。这时分就会有一些踢人下线的需求,比方你在一台电脑登录了PC端,这时分你再别的一台电脑也登录PC端,这时分之前在别的一台电脑上就会被强制下线。

或许你登录了PC端,这时分你登陆了APP或许小程序,这时分PC端的账号也会被强制下线

2:项目只需PC端

假设咱们现在的项目只需PC端,没有小程序或许APP,那么这时分便是很简略了,用户的sessin(也便是所谓的Token)一般都是存储在redis中,session中包含用户ID等一些信息,当然还有一个最重要的便是登录的ip地址。

多端登录如何实现踢人下线

1:用户在登录的时分,从redis中获取用户session,假如没有就能够直接登录了

2:用户在别的一台电脑登录,从redis中获取到用户session,这时分用户session是有的,阐明用户之前现已登录过了

3:这时分从用户session中获取IP,判断二者的ip是不是相同,假如不同,这时分就要发送一个告诉给客户端,让别的一台设备登录的账号强制下线即可

3:项目有PC端和APP端和小程序端

当你的应用有PC端和APP端的时分,咱们用户的session假如仍是只存一个ip地址,那显着便是不行的,由于很多状况下,咱们PC端和APP端是能够一起登录的,比方淘宝,京东等都是,也便是所谓的双端登录

这时分就会有多种状况

单端登录:PC端,APP端,小程序只能有一端登录
双端登录:允许其间二个端登录
三端登录:三个端都能够一起登录

关于三端能够一起登录就很简略,但是现在有个限制,便是app端只能登录一次,不能一起登录,也便是我一个手机登录了APP,别的一个手机登录的话,之前登录的APP端就要强制下线

所以咱们的用户session存储的格式如下

{
   userId:用户的id
   clientType:PC端,小程序端,APP端
   imei:便是设备的仅有编号(关于PC端这个值便是ip地址,其他的便是手机设备的一个仅有编号)
}

单端登录

首要咱们要知道,用户登录不同的设备那么用户session是不相同的。关于单端登录,那么咱们能够拿到用户的一切的session,然后依据clientType和imei号来强制将其它端的用户session删除掉,然后告诉客户端强制下线

双端登录

同样拿到一切用户的session,然后依据自己的事务需求来断定哪一端需求强制下线,比方咱们现在现已登录了PC端和APP端,这时分登录小程序,现在要让APP端的强制下线。

这时分登录之后获取用户一切的session,这时分会有二个用户session,首要拿到clientType = APP的session,然后来告诉客户端这个端需求强制下线。

假如这时分我登录了PC端和一个APP端,这时分我用别的一台手机登录APP端,那么之前那台手机上登录的APP端就要被强制下线,这个时分仅经过clientType是不行的,由于我二个手机登录的clientType都是APP端。所以这时分就要依据imei号来判断了。由于不同的手机imei号是不相同的。

这时分我拿到用户一切的session


  PC端的session
  sessionA{
      userId: 1,
      clientType: PC,
      imei: "123"
  }
  APP端的session
  sessionA{
      userId: 1,
      clientType: APP,
      imei: "12345"
  }

这时分我从别的一台手机登录的时分,生成的session应该是这样的

 APP端的session
  sessionA{
      userId: 1,
      clientType: APP,
      imei: "1234567"
  }

我发现同一个clientType的session现已有了,这时分我要判断imei号是否相同,imei相同阐明是同一台设备,不同阐明不是同一台设备,咱们只需求把对应设备的账号强制下线即可了

总结

不管是单端登录,双端登录仍是多端登录,咱们都是依据用户session来判断。只需依据clientType和imei号来就能够满意咱们大部分的踢人下线需求了。