系统在设计时需要保证用户唯一登录,如现在的QQ等只能在一端登入。就是用户用A这个账号登录之后,其他人都不能再使用登录了。如果另一个用户登录的话,就会把当前这个用户踢下线来。
设计流程
数据库SQL
CREATE TABLE `user_token` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT '主键',
`token` VARCHAR ( 255 ) DEFAULT NULL COMMENT '令牌',
`login_type` VARCHAR ( 255 ) CHARACTER
SET utf8 DEFAULT NULL COMMENT '登录类型{pc、androad、ios}',
`device_info` VARCHAR ( 255 ) DEFAULT NULL COMMENT '设备信息',
`is_availability` INT ( 2 ) DEFAULT NULL COMMENT '是否在线(0在线,1下线)',
`user_id` INT ( 11 ) DEFAULT NULL COMMENT '用户id',
PRIMARY KEY ( `id` )
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4;
核心代码
// 用户每一个端登录成功之后,会对应生成一个token令牌(临时且唯一)存放在redis中作为rediskey
TransactionStatus transactionStatus = null;
try {
// 获取userid
Long userId = userDo.getUserId();
// 根据userId+loginType查询当前登陆类型账号之前是否有登陆过,如果登录过,清除之前redistoken
UserTokenDo userTokenDo = userTokenMapper.selectByUserIdAndLoginType(userId, loginType);
transactionStatus = redisDataSour