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号来就能够满意咱们大部分的踢人下线需求了。