2019独角兽企业重金招聘Python工程师标准>>>
一、使用redis存token
redis key设计
access_token_{token}:{userInfoJsonStr}
用户登录成功后,把token作为key,用户信息做为value。作用:通过token可以查到userinfo
token_by_userId_{userId}:{token}
用户登录成功后,把用户id作为key,token作为值:作用:通过userid可以查到token
注意:两个key的过期时间一样
代码逻辑
用户登录验证时,通过token_by_userId_{userId},查看redis中是否存在此key,如果存在,则说明,用户已经登录。
根据查到的token,删掉access_token_{token},然后再去登录操作。(此过程把上一此登录的信息删掉,上一次登录的账号就会被下线。)
二、如果是使用db存token
CREATE TABLE `gwy_login_token` (`user_id` int(11) NOT NULL,`token` varchar(100) NOT NULL COMMENT 'token',`expire_time` datetime DEFAULT NULL COMMENT '过期时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`user_id`),UNIQUE KEY `token` (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户Token';
思路:
用户数据账号密码,如果登录成功,就在上面表中新增一条数据。
user_id token expire_time update_time
2 96ec9ec9c8fc40f5a98f3d184450896d 2018-06-26 23:33:02 2018-06-26 11:33:02
该用户第二次登录,如果登录成功,就修改数据为:
user_id token expire_time update_time
2 48d3cc4069b94403a82d3d7905499076 2018-06-26 23:33:27 2018-06-26 11:33:27
由于96ec9ec9c8fc40f5a98f3d184450896d token被覆盖,所以用户使用此token请求接口的时候,服务端就返回:用户未登录。