项目需求:
现在项目有PC端,WEB端,APP端
同端不允许同时登陆,不同端可以同时登陆
并没有涉及太多复杂的逻辑,这里只探讨结合Redis进行不同端的登陆控制.
具体方案:
1 - 将token存到redis中
2 - token: 类型-用户id-随机数
3 - 用户登录时根据类型和id删除原token,写入新token
4 - 用户退出时根据类型和id删除原token
上代码:
1 - 登陆
public String login(String phone, String password, String type) { User user = getUserByPhone(phone); if (user == null) { return "NOT_FOUND"; } if (!checkPassword(user.getPassword(), password)) { return "PASSWORD_ERROR"; }// 删除redis中原token deleteToken(user, type); // 生成新token,存redis,返回 return setToken2Redis(user, type); }
2 - 删除原token
public void deleteToken(User user, String type) { String deleteRegex = type + "-" + user.getId() + "*"; Set<String> keys = redisTemplate.keys(deleteRegex); redisTemplate.delete(keys); }
3 - 生成新token
public String setToken2Redis(User user, String type) { String token = createToken(user, type); // 登陆时其它信息缓存... return token; }
尽可能的简单,只要满足现在的使用就可以.
因为需求在变,越简单越容易重构.