同平台不允许同时登陆的方案(不同平台可同时登陆)

项目需求:

现在项目有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;
}

尽可能的简单,只要满足现在的使用就可以.

因为需求在变,越简单越容易重构.

知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。
原文地址:https://www.cnblogs.com/SamNicole1809/p/13563477.html